grep schließt mehrere Zeichenfolgen aus


115

Ich versuche, eine Protokolldatei mit tail anzuzeigen -fund möchte alle Zeilen ausschließen, die die folgenden Zeichenfolgen enthalten:

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

Ich kann eine Zeichenfolge wie folgt ausschließen:

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

Aber wie kann ich Zeilen ausschließen , die entweder von string1oder string2.

Antworten:


106

Zwei Beispiele zum Herausfiltern mehrerer Zeilen mit grep:

Geben Sie dies ein filename.txt:

abc
def
ghi
jkl

Befehl grep mit der Option -E mit einer Pipe zwischen Token in einer Zeichenfolge:

grep -Ev 'def|jkl' filename.txt

Drucke:

abc
ghi

Befehl mit der Option -v mit Pipe zwischen Token, die von Parens umgeben sind:

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

Drucke:

abc
ghi

15
Ich bin überrascht, dass niemand über die grep -v -e def -e jklMethode gesprochen hat, die
meiner Meinung nach

4
Oder noch besser: grep -Fv -e def -e jklwas noch schneller ist!
Frizlab

11
Mit dem Flag -F können Sie Zeilenumbrüche anstelle von Pipes als Trennzeichen verwenden. Dies ermöglicht die Verwendung der Befehlsausgabe als Filter einfacher, z. B.:grep -vF $(pgrep myprocess)
Phlarx

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

-F Übereinstimmungen durch wörtliche Zeichenfolgen (anstelle von Regex)

-v kehrt das Match um

-e ermöglicht mehrere Suchmuster (alle wörtlich und invertiert)


1
Dies ist die richtige Antwort: Die einzige, die sowohl die mehrfachen grep -vInstanzen als auch die künstliche Anforderung eines regulären Ausdrucks vermeidet (lässt die mehreren Zeichenfolgen in separaten Argumenten sauber angeben). Stellen Sie sich vor, Sie konstruieren diesen
regulären Ausdruck

Tatsächlich ist keine dieser Antworten richtig, denn wenn keine Schlüsselwörter zum Ausschließen übergeben werden, wird alles statt nichts ausgeschlossen.
Győri Sándor

37

Eine andere Möglichkeit besteht darin, eine Ausschlussliste zu erstellen. Dies ist besonders nützlich, wenn Sie eine lange Liste von Dingen haben, die ausgeschlossen werden sollen.

vi /root/scripts/exclude_list.txt

Fügen Sie nun hinzu, was Sie ausschließen möchten

Nopaging the limit is
keyword to remove is

Verwenden Sie jetzt grep, um Zeilen aus Ihrer Dateiprotokolldatei zu entfernen und nicht ausgeschlossene Informationen anzuzeigen.

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

1
Ich wusste nicht , Sie nutzen könnten -vmit -f(oder dass dieser noch gar nicht existierte).
Sridhar Sarnobat

sehr sehr nützlich!
Samaspin

Beachten Sie, dass Sie keine temporäre Datei für die Ausschlussliste erstellen müssen. In Bash können Sie die Prozessersetzung verwenden. Dies ist praktisch, wenn die Ausschlussliste etwas dynamisch ist und Sie sie vor jeder Verwendung nur einmal generieren müssen: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

Sie können reguläres grep wie folgt verwenden:

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


1
Diese Antwort funktionierte für mich unter MacOSX. Das Entkommen aus der Pfeife ist der Schlüssel
Rebecca Dessonville

5

Die Greps können verkettet werden. Beispielsweise:

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

1
Der Haken dabei ist, dass Sie anstelle eines Prozesses, der herausgefiltert werden würde, N Prozesse nacheinander ausführen müssten, wobei jeder von ihnen etwas herausfiltert. Es könnte die Dinge erheblich verlangsamen.
Artem Oboturov
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.