Proste awkrozwiązania:
Załóżmy, że wyrażenie regularne używane do znajdowania pasujących wierszy jest przechowywane w zmiennej powłoki $regexi liczba wierszy do pominięcia $count.
Jeśli pasująca linia również powinna zostać pominięta ( $count + 1linie 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 ( $countlinie 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 awkzmienne 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 printpoprzednie nextzapewnia, ż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ę
1jest 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
1jest równoważny { print }, 1jest 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, awkdomyślnie drukowany jest wiersz.
+Nwzorzec jest rozszerzeniem GNU. Zmień pierwszynna aNw drugim przykładzie, aby zawierał linię ze wzorem.