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.

Jeets
źródło

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
Eric Leschinski
źródło
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)

wisbucky
źródło
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
rezizter
źródło
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
22
egrep -v "Nopaging the limit is|keyword to remove is"
Stefana Podkowińskiego
źródło
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
źródło
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"

mikhail
źródło
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"
Fidel
źródło
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