grep wyklucza wiele ciągów


117

Próbuję zobaczyć plik dziennika przy użyciu tail -fi chcę wykluczyć wszystkie wiersze zawierające następujące ciągi:

"Nopaging the limit is"`  and `"keyword to remove is"

Jestem w stanie wykluczyć jeden taki ciąg:

tail -f admin.log|grep -v "Nopaging the limit is"

Ale jak mogę wykluczyć wiersze zawierające którykolwiek z string1lub string2.

Odpowiedzi:


107

Dwa przykłady odfiltrowywania wielu wierszy za pomocą grep:

Umieść to w filename.txt:

abc
def
ghi
jkl

grep polecenie używające opcji -E z potokiem między tokenami w ciągu:

grep -Ev 'def|jkl' filename.txt

wydruki:

abc
ghi

Polecenie używające opcji -v z potokiem między tokenami otoczonymi parami:

egrep -v '(def|jkl)' filename.txt

wydruki:

abc
ghi

15
Jestem zaskoczony, że nikt nie mówił o grep -v -e def -e jklmetodzie, która IMHO jest jaśniejsza…
— Frizlab

4
Albo jeszcze lepiej: grep -Fv -e def -e jklco jest jeszcze szybsze!
— Frizlab

11
Z opcją -F można używać znaków nowej linii jako separatorów zamiast potoków. Pozwala to na łatwiejsze użycie wyjścia polecenia jako filtru, np .:grep -vF $(pgrep myprocess)
— Phlarx

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F dopasowania według literałów (zamiast wyrażenia regularnego)

-v odwraca dopasowanie

-e pozwala na wiele wzorców wyszukiwania (wszystkie dosłowne i odwrócone)


1
To jest właściwa odpowiedź: jedyna, która pozwala uniknąć zarówno wielu grep -vwystąpień, jak i sztucznego wymagania wyrażenia regularnego (pozwala na wyraźne określenie wielu ciągów w oddzielnych argumentach). Wyobraź sobie programowe konstruowanie tego wyrażenia regularnego w skrypcie dla ciągów, które mogą zawierać cokolwiek…
— user2394284

Właściwie żadna z tych odpowiedzi nie jest poprawna, ponieważ nie przekazując żadnych słów kluczowych do wykluczenia, spowoduje to wykluczenie wszystkiego zamiast niczego.
— Győri Sándor

37

Inną opcją jest utworzenie listy wykluczeń, jest to szczególnie przydatne, gdy masz długą listę rzeczy do wykluczenia.

vi /root/scripts/exclude_list.txt

Teraz dodaj to, co chcesz wykluczyć

Nopaging the limit is
keyword to remove is

Teraz użyj grep, aby usunąć linie z pliku dziennika i wyświetlić informacje, które nie są wykluczone.

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
Nie zdawałem sobie sprawy, że możesz użyć -vz -f(lub że to drugie w ogóle istnieje).
— Sridhar Sarnobat

bardzo przydatne!
— samaspin

Pamiętaj, że nie musisz tworzyć pliku tymczasowego dla listy wykluczeń. W bashu możesz używać podstawiania procesów. Jest to przydatne, jeśli lista wykluczeń jest nieco dynamiczna i musiałbyś ją wygenerować przed każdym użyciem tylko raz:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
— Miroslav


15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'

11

Możesz użyć zwykłego grepa w ten sposób:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
Ta odpowiedź działała dla mnie na MacOSX. Kluczem jest
— ucieczka

5

Grepy mogą być przykute łańcuchami. Na przykład:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
Problem polega na tym, że zamiast procesu, który byłby odfiltrowywany, musiałbyś uruchamiać N procesów sekwencyjnie, gdzie każdy z nich coś odfiltrowuje. Może to znacznie spowolnić działanie.
— Artem Oboturov
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.