Imprime algumas linhas antes e depois da correspondência de padrões, excluindo as linhas correspondentes a outros padrões

3

Eu uso o awk no Solaris para imprimir 5 linhas antes e depois de uma correspondência de padrões. Atualmente, o seguinte one-liner faz o trabalho:

/usr/xpg4/bin/awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=5 a=5 s="ERROR" file

No entanto, o resultado não é satisfatório. Primeiro de tudo, contém linhas indesejadas como

  • linhas com o próprio jogo
  • linhas vazias
  • linhas que correspondem aos padrões (indesejados) como
    • remover
    • bobagem
    • estúpido

Além disso, há um requisito de que cada fundação seja separada por uma linha com alguns traços.

Exemplo de entrada:

stupid
remove

keep it
*
MATCH
keep it as well



remove

important
                                                     *
MATCH at line 2:
needed
also

this line should be kept
                                                     *
MATCH at line 2:
this to save
very important



remove

keep it
*
MATCH
keep it as well

nonsense
another nonsense

Resultado esperado:

keep it
keep it as well
---
important
needed
also
---
this line should be kept
this to save
very important
---
keep it
keep it as well

Como conseguir isso de uma maneira elegante?

    
por nickm 10.02.2016 / 15:06

1 resposta

2

Embora a saída esperada não seja clara, tentarei. Se você tiver os utilitários do gnu no Solaris, você pode usar o gawk e o ggrep de uma maneira muito simples:

gawk 'NF > 0' fileName  |ggrep -C5 pattern

Você pode adicionar um | ggrep -v algumPadrão no final para filtrar palavras indesejadas.

    
por 17.02.2016 / 03:51

Tags