Proste awk
rozwiązania:
Załóżmy, że wyrażenie regularne używane do znajdowania pasujących wierszy jest przechowywane w zmiennej powłoki $regex
i liczba wierszy do pominięcia $count
.
Jeśli pasująca linia również powinna zostać pominięta ( $count + 1
linie są pomijane):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
Jeśli pasująca linia nie powinna być pomijana ( $count
linie po dopasowaniu są pomijane):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
Wyjaśnienie:
-v regex="$regex" -v count="$count"
definiuje awk
zmienne w oparciu o zmienne powłoki o tej samej nazwie.
$0 ~ regex
pasuje do linii zainteresowania
{ skip=count; next }
inicjalizuje licznik pominięć i przechodzi do następnej linii, skutecznie pomijając pasującą linię; w drugim rozwiązaniu print
poprzednie next
zapewnia, że nie jest ono pomijane.
--skip >= 0
zmniejsza liczbę pominięć i podejmuje działanie, jeśli jest (nadal)> = 0, co oznacza, że linia powinna zostać pominięta.
{ next }
przechodzi do następnej linii, skutecznie pomijając bieżącą linię
1
jest powszechnie używanym skrótem { print }
; to znaczy, że bieżący wiersz jest po prostu drukowany
- Do tego polecenia docierają tylko niepasujące i niepominięte wiersze.
- Powód, który
1
jest równoważny { print }
, 1
jest interpretowany jako wzorzec boolowski, który z definicji zawsze przyjmuje wartość true, co oznacza, że skojarzona z nim akcja (blok) jest wykonywana bezwarunkowo. Ponieważ w tym przypadku nie ma skojarzonej akcji, awk
domyślnie drukowany jest wiersz.
+N
wzorzec jest rozszerzeniem GNU. Zmień pierwszyn
na aN
w drugim przykładzie, aby zawierał linię ze wzorem.