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.