Abordagem alternativa de AWK
$ awk -v start=3 '/Pattern/{n++;next};n==start;n==start+1{exit}' input.txt
Line 11
Line 12
$ awk -v start=2 '/Pattern/{n++;next};n==start;n==start+1{exit}' input.txt
Line 8
Line 9
Explicação
A maneira como isso funciona é bastante simples:
- usando
-v
flag definimos uma variável que incrementamos se encontrarmos o padrão correspondente e passarmos para a próxima linha (essa é a parte /Pattern/{n++;next}
do código)
- no awk se a condição for verdadeira, isso é automaticamente um sinal para imprimir coisas, portanto
n==start
pode ser visto como n==start{print}
.
- codeblock final onde olhamos se chegamos ao próximo padrão é
n==start+1
{exit} . Say we wanted to print lines between 4th and 5th pattern occurrence. This will mean that when
n == 4 + 1 'o código sai
Se estivéssemos fazendo code-golf, poderíamos tornar isso ainda mais curto mudando apenas a variável start
para algo como -v s=1
, o que encurta o código da seguinte forma:
awk -v s=3 '/Pattern/{n++;next};n==s;n==s+1{exit}'
Suposições:
- GNU awk
- estamos lendo entre padrões consecutivos, ou seja, entre a correspondência
n
e n+1
Generalizando a abordagem
E se quiséssemos imprimir linhas entre o padrão 2 e o padrão 4? Usando alguns truques usados no exemplo anterior, podemos fazer isso também:
$ awk -v start=2 -v finish=4 '/Pattern/{n++;next};n==finish{exit};n>=start' input.txt
Line 8
Line 9
Line 11
Line 12
Observe que aqui definimos outra variável, finish
, para saber onde parar. Dessa forma, n==finish
parará de imprimir as linhas. Observe também que n==finish{exit}
vem antes de n>=start
, o que nos permite evitar a impressão redundante da mesma linha na qual devemos sair.