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.

Jeets
quelle

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
Eric Leschinski
quelle
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)

wisbucky
quelle
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
Rezizter
quelle
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
22
egrep -v "Nopaging the limit is|keyword to remove is"
Stefan Podkowinski
quelle
15
tail -f admin.log|grep -v -E '(Nopaging the limit is|keyword to remove is)'
hs.chandra
quelle
11

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

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

mikhail
quelle
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"
Fidel
quelle
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