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 grep
solução:
grep -A2 -P '^UNIX$' file
Explicação: -A
significa: 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 {...}
. n
significa próximo, p
significa imprimir. Isso também é feito duas vezes.
Responder2
Uma awk
solução:
$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6
Explicação
/^UNIX$/{i=1;next}
: se virmosUNIX
, definimos a variáveli = 1
, processando para a próxima entrada.Se a variável
i
for definida (o que significa que vimosUNIX
),i && i++ <= 2
apenas será avaliada como valor verdadeiro nas próximas duas linhas apósUNIX
, causandoawk
a ação padrão executadaprint $0
.Antes de ver
UNIX
,i
não estava definido e começava na 3ª linha depois deUNIX
,i
tinha um valor maior que 2, o que torna a expressãoi && i++ <= 2
avaliada como falsa, fazendo com queawk
nã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:
1,/UNIX/d
-remove texto após correspondência%p
- imprime bufferq!
- saia sem salvar as alterações no arquivo (usewq
para editar no local)