Como posso ler um certo número de linhas depois de encontrar algum texto?
Por exemplo.:
Leia as próximas 2 linhas depois de 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, preciso apenas de uma luz. Pensando em criar outro script para fazer isso.
$
sinal no início da minha resposta é um prompt de shell, não parte doawk
comando.awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
Uma
grep
solução:Explicação:
-A
significa: imprima as próximas duas linhas após a correspondênciaOu
awk:
Explicação: Essa instrução procura pelo UNIX na linha (
$0=="UNIX"
). Se isso for dado, ele obtém o próximo próximo no buffer (getline
) e imprime o buffer (print
). Isso é feito duas vezes.Ou use
sed
:Explicação: Isso procura pelo UNIX (
/^UNIX$/
). Se isso for encontrado, ele executará a parte no{...}
.n
significa próximo,p
significa imprimir. Isso é feito duas vezes também.fonte
getline; print;
parte naawk
declaração ou an;p;
parte nased
declaração.grep -A100 -P '^UNIX$' file | tail -n +2
. A parte da cauda é para remover o primeiro penhor. Nos outros (sed, awk), você teria que escrever loops, o que torna menos simples.A página de manual do grep descreve a opção assim:
fonte
UNIX
na saída.UNIX
, canalizá-lo paratail
:[...] | tail -n +1
, oused
:[...] | sed '1d'
.tail
esed '1d'
funcionam apenas corretamente seUNIX
aparecer apenas uma vez no texto de entrada. Todas as outras respostas permitem múltiplas ocorrências. Talvez seja melhor sugerir... | grep -v UNIX
. É certo que isso fica confuso seUNIX
aparecer nas linhas 15 e 17.sed
com alguma forma desed '/UNIX/d;n;n;p/' /path/to/file
, que eu acabei de ler e enviar como resposta.Isso parece fazer o truque bem:
Prova de conceito:
fonte
for
loop não é necessário.Você pode usar
ex
:Onde:
1,/UNIX/d
- remove o texto após a partida%p
- imprime bufferq!
- saia sem salvar as alterações no arquivo (usewq
para editar no local)fonte