Grep-Dateien mit Regex

1

Ich habe eine Datei mit ein paar Protokollzeilen.

Ich möchte Dateien zurückgeben, die das Wort 'fail' enthalten, aber das Muster nicht enthalten:

Failed any test here _fr in Pro-any text here

Also, wenn es enthält: _fr in Pro

Ignorieren Sie dann die Zeile, auch wenn sie das Wort fail enthält.

cool breeze
quelle
Das könnte Sie interessieren Logparser (Microsofts) oder ähnlich für Unix? .
Andrew Morton

Antworten:

3

Betrachten wir diese Testdatei:

$ cat >test.log
keep fail
omit fail  _fr in Pro-

So finden Sie alle Zeilen, die Ihren Kriterien entsprechen:

$ awk '/[fF]ail/ && ! /_fr in Pro-/' test.log
keep fail

So drucken Sie nur die Namen von Dateien mit Zeilen, die Ihren Kriterien entsprechen:

$ awk '/[fF]ail/ && ! /_fr in Pro-/ {print FILENAME; exit}' *.log
test.log

Wie es funktioniert:

Awk liest implizit eine Datei Zeile für Zeile durch. Die Bedingung /[fF]ail/ && ! /_fr in Pro-/ stimmt mit jeder Zeile überein, die enthält Fail oder fail aber nicht enthalten _fr in Pro-. In awk && bedeutet logisch-und ! bedeutet logisch-nicht.

Beides ablehnen _fr in Pro- und _en in Pro-

Betrachten Sie diese Testdatei:

$ cat test.log
keep fail
omit fail  _fr in Pro-
omit fail  _en in Pro-

So lehnen Sie beide Formulare ab:

$ awk '/[fF]ail/ && ! /_(fr|en) in Pro-/' test.log
keep fail
John1024
quelle
Wie könnte _fr oder _en? Ich habe es mit _ [fr | en] versucht, aber das schien nicht zu funktionieren.
cool breeze
2
@kühle Brise [fr|en] Stimmt mit einem der Zeichen überein f, r, |, e, oder n. Das Formular für logisch-oder ist (fr|en). Weitere Informationen finden Sie in der aktualisierten Antwort.
John1024