Você pode usar abaixo de awk
:
awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile
Isso imprimirá as linhas correspondidas com line1
até a próxima primeira linha correspondida com line5
e sairá imediatamente.
Eu tenho um arquivo que se parece com o seguinte:
line1
line2
line3
line4
line5
line6
line7
line5
line2
Eu quero obter dados entre line1
e line5
. Eu usei awk '/line1/,/line5/' myfile
. Esperando que a saída seja:
line1
line2
line3
line4
line5
Mas o awk lê até a última correspondência line5
. Eu desejo que o awk pare no primeiro jogo e não no último jogo.
Você pode usar abaixo de awk
:
awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile
Isso imprimirá as linhas correspondidas com line1
até a próxima primeira linha correspondida com line5
e sairá imediatamente.
Não consigo reproduzir seu problema. O awk * faz o que eu esperaria: imprimir cada linha entre a primeira ocorrência de line1
até a primeira ocorrência de line5
:
$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5
É possível que você tenha um caractere de não-impressão oculto em algum lugar dentro da string line5
na quinta linha do seu arquivo? Isso explicaria por que awk
não corresponde a ele.
Você pode verificar novamente executando o sed
equivalente:
$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5
O -n
instrui sed
a não imprimir todas as linhas (seu comportamento padrão) enquanto /line1/,/line5/p
instrui a impressão de cada linha da primeira correspondência de line1
até a primeira correspondência de line5
.
Se quiser imprimir somente o conjunto de linhas primeiro começando com uma linha que corresponda ao padrão line1
e terminando com uma linha que corresponda a line5
, você poderá usar:
sed -n '/line1/,$p;/line5/q' file
* Eu verifiquei usando gawk
, a implementação GNU de awk
(e Kusalananda confirmou que awk
e mawk
no OpenBSD também fazem a coisa certa).
awk '/foo/,/bar/'
imprime todas as seções do arquivo que começam com uma linha correspondente a foo
e terminam com a próxima linha depois disso (ou até mesmo a mesma linha contrária ao sed
equivalente) correspondente bar
(e observe que a line1
regexp também corresponde a uma linha que contém line1anything
incluindo line10
).
Se você quisesse combinar na seção primeiro começando com uma linha que corresponde a line1
e terminando com a próxima linha depois disso (ou na mesma linha) que corresponde a line5
, faça:
sed '/line1/,$!d;/line5/q' < file
(observe que, se não houver linha que corresponda a line5
após a primeira que corresponder a line1
, ela será impressa da linha line1
até o final do arquivo. Observe também que os padrões sed
são < expressões básicas, enquanto awk
são extensões estendidas.
Tags text-processing perl awk sed