imprime vários números de linhas antes e depois de um padrão

1

Eu tenho um diretório com milhares de arquivos com o seguinte padrão repetitivo contendo centenas de seções -

###############
# Section 1
###############
some text
more text
some more text
some text
more text
some more text    
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############
# Section 3
###############
some text
more text
some more text
some text
more text
some more text

O que eu preciso fazer é descobrir uma maneira de extrair toda a seção onde existe o "padrão interessante".

Eu tentei fazer um grep -iEr 'pattern interessante' com sinalizadores -A e -B, mas isso não funciona porque em cada arquivo pode haver diferentes números de linhas na seção antes e depois do padrão intersting.

Qual é a melhor maneira de fazer isso?

    
por user168115 22.06.2017 / 02:01

1 resposta

0

Este não é um trabalho para o grep, mas para uma ferramenta melhor como o awk.

A solução mais fácil é usar o gnu awk com um separador de registro personalizado RS como Section .

Usando a palavra "Seção" para separar linhas, o que estiver entre as palavras Section 1 e Section 2 será considerado como uma linha para o awk.
O mesmo para a Seção 2 - Seção 3, etc.

Agora você só precisa imprimir a "linha" correta = a "linha" que inclui o interesting-pattern .

$ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############

Como o gnu awk pode aceitar regex no RS (Record Separator) você também pode aplicar algo mais complicado no RS assim:

$ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}'
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    

PS: {print RT instrui o awk a imprimir o Separador de Registros usado atualmente

    
por 22.06.2017 / 03:45

Tags