
Ich habe eine Datei mit einer Reihe von Protokollzeilen.
Ich möchte Dateien zurückgeben, die das Wort „fail“ enthalten, aber nicht das folgende Muster:
Failed any test here _fr in Pro-any text here
Wenn es also enthält: _fr in Pro-
Ignorieren Sie dann die Zeile, auch wenn sie das Wort „fail“ enthält.
Antwort1
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 der Dateien, deren Zeilen Ihren Kriterien entsprechen:
$ awk '/[fF]ail/ && ! /_fr in Pro-/ {print FILENAME; exit}' *.log
test.log
Wie es funktioniert:
Awk liest eine Datei implizit Zeile für Zeile durch. Die Bedingung /[fF]ail/ && ! /_fr in Pro-/
trifft auf jede Zeile zu, die oder enthält Fail
, fail
aber nicht enthält _fr in Pro-
. In awk &&
bedeutet logisch-und und !
bedeutet logisch-nicht.
Ablehnung beider _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