awkSoluções simples :
Suponha que a expressão regular a ser usada para encontrar linhas correspondentes seja armazenada na variável shell $regexe a contagem de linhas a serem puladas $count.
Se a linha correspondente também deve ser ignorada (as $count + 1linhas são ignoradas):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Se a linha correspondente deveria não ser pulada ($countlinhas após a correspondência são puladas):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Explicação:
-v regex="$regex" -v count="$count"define awkvariáveis com base em variáveis de shell de mesmo nome.
$0 ~ regex corresponde à linha de interesse
{ skip=count; next }inicializa a contagem de pulados e prossegue para a próxima linha, pulando efetivamente a linha correspondente; na 2ª solução, oprint antes nextgarante que é não ignorado.
--skip >= 0 diminui a contagem de saltos e executa uma ação se (ainda)> = 0, o que implica que a linha em questão deve ser saltada.
{ next } prossegue para a próxima linha, efetivamente pulando a linha atual
1é uma abreviação comumente usada para { print }; ou seja, a linha atual é simplesmente impressa
- Somente linhas não correspondentes e não puladas alcançam este comando.
- A razão de que
1é equivalente a { print }é que 1é interpretado como um padrão booleano que por definição sempre avalia como verdadeiro, o que significa que sua ação associada (bloco) é executada incondicionalmente. Como não há nenhuma ação associada neste caso, o awkpadrão é imprimir a linha.
+Npadrão é uma extensão GNU. Mude o primeironpara umNem seu segundo exemplo para fazê-lo incluir a linha com o padrão.