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
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.
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
Tags grep text-processing awk sed