Za pomocą grep
chcę wybrać wszystkie linie, które pasują do wzoru i które nie pasują do innego wzoru. Chcę móc użyć pojedynczego wywołania, grep
aby móc skorzystać z --after-context
opcji (lub --before-context
, lub --context
).
-v
nie jest tutaj wykonalne, ponieważ neguje wszystkie wzorce, które przekazuję grep
przy użyciu -e
opcji.
Przykład
Chcę szukać pasujących linii needle
, ignorując pasujące linie ignore me
, z jedną linią następującego kontekstu.
Oto mój plik wejściowy:
one needle ignore me
two
three
four needle
five
Dane wyjściowe, których chcę, to:
four needle
five
Jak widać, to naiwne rozwiązanie nie działa:
$ cat file | grep --after-context=1 needle | grep -v 'ignore me'
two
---
four needle
five
ack
Sugerowałbym użycie zamiast tego awk, ponieważ lepiej obsługuje on wieloliniowe operacje we / wy. Albo 1) Prześlij wyniki do GNU awk
--\n
za pomocą separatora rekordów, lub 2) Wykonaj całe dopasowanie w awk.opcja 1
Wynik:
Uwaga: ta opcja przeszukuje cały rekord
ignore me
, ustawiaFS=1
i dopasowuje,$1
aby porównać tylko z pierwszym wierszem.Opcja 2
źródło
ignore me
w pliku jest wiele , awk nie działa--\n
między każdą dopasowaną grupą znajduje się separator, którego nie ma, jeśli grupy sąsiadują ze sobą. Sposób obsługi sąsiednich grup jest zależny od zadania, więc niekoniecznie jest to złe. Opcja 2 nie zależy od separatora i nie ma na nią wpływu.