Como ler certas linhas depois de encontrar algum texto?

Como ler certas linhas depois de encontrar algum texto?

Como posso ler um certo número de linhas depois de encontrar algum texto?

Por exemplo.:

Leia as próximas 2 linhas após encontrar "Unix" em:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

O resultado pode ser:

Test 5
Test 6

Nota: O "Unix" no último exemplo é um argumento e, portanto, pode ser qualquer outro texto.

O que eu tenho:

Ainda estou sem ideias, só preciso de uma luz. Pensando em criar outro script para fazer isso.

Responder1

Uma grepsolução:

grep -A2 -P '^UNIX$' file

Explicação: -Asignifica: imprimir as próximas duas linhas após a partida

Ouawk:

awk '$0=="UNIX"{getline; print; getline; print}' file

Explicação:Procure UNIX na linha ( $0=="UNIX"). Se encontrado, coloque a próxima linha no buffer ( getline) e imprima o buffer ( print). Isso é feito duas vezes.

Ou use sed:

sed -n '/^UNIX$/{n;p;n;p}' file

Explicação:Procure por UNIX ( /^UNIX$/). Se encontrado, execute a parte no arquivo {...}. nsignifica próximo, psignifica imprimir. Isso também é feito duas vezes.

Responder2

Uma awksolução:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

Explicação

  • /^UNIX$/{i=1;next}: se virmos UNIX, definimos a variável i = 1, processando para a próxima entrada.

  • Se a variável ifor definida (o que significa que vimos UNIX), i && i++ <= 2apenas será avaliada como valor verdadeiro nas próximas duas linhas após UNIX, causando awka ação padrão executada print $0.

  • Antes de ver UNIX, inão estava definido e começava na 3ª linha depois de UNIX, itinha um valor maior que 2, o que torna a expressão i && i++ <= 2avaliada como falsa, fazendo com que awknão faça nada.

Responder3

grep -A 2 UNIX file.txt

A página de manual do grep descreve a opção assim:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

Responder4

Você pode usar ex:

ex -s +'1,/UNIX/d|%p|q!' file_or_/dev/stdin

onde:

informação relacionada