grep pattern antes de outro padrão e imprima tudo

4

Dado intput:

Via: 1.1.1.1  
not relevant line  
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 2.2.2.2
not relevant line  
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
Via: 3.3.3.3
not relevant lines
Via: 4.4.4.4
not relevant
Via: 5.5.5.5
not relevant line  
keyword + some text
...
not relevant line N
keyword + some text
...
not relevant line N
not relevant line N
...

Resultado exigido:

Via: 1.1.1.1  
keyword + some text A
keyword + some text A
Via: 2.2.2.2
keyword + some text B
keyword + some text C
Via: 5.5.5.5
keyword + some text D
keyword + some text E

A string de palavra-chave pode ocorrer N vezes em qualquer bloco Via ou pode não ocorrer. Na saída, preciso apenas dos blocos Via, em que a palavra-chave ocorre junto com as sequências de palavras-chave que pertencem a elas. A resposta mais próxima que encontrei é aqui , mas não consigo fazer o que preciso.

    
por Olga 01.10.2017 / 21:09

2 respostas

5

com sed :

sed -n '/^Via:/{ x; /keyword/p; d; }; /keyword/H; ${ x; /keyword/p; }' input.txt

Ou, se você quiser keyword ancorado no início da linha:

sed -n '/^Via:/{ x; /\nkeyword/p; d; }; /^keyword/H; ${ x; /\nkeyword/p; }' input.txt
    
por 01.10.2017 / 21:27
4
Solução

Awk :

awk '/^Via:/{ f=1; r=$0; kw=0; next }
     f && /keyword/{ printf "%s%s\n",(!kw)? r ORS:"",$0; kw++ }' file
  • /^Via:/ - captura da linha que começa com Via: na variável r . Defina o sinalizador f=1 no estado "ativo" indicando o processamento de um determinado Via block

  • kw - sinalizador denotando o número de "palavra-chave" linhas sob cada Via bloco

  • f && /keyword/ - durante o processamento de linhas em Via block - considere apenas as linhas que correspondem a keyword pattern

por 01.10.2017 / 21:42