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