Filtern einer Protokolldatei

Filtern einer Protokolldatei

Ich habe versucht, meine Protokolldatei nach Funktionalität zu filtern. Beispiel:

195.xx.x.x - - [13/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts&xxxx...
192.xx.x.x - - [13/Apr/2017:09:45:xx +0200] "POST /userx/index.php?m=customer&xxxx...
197.xx.x.x - - [13/Apr/2017:09:10:xx +0200] "POST /userx/index.php?m=meeting&xxxx...
197.xx.x.x - - [13/Apr/2017:09:20:xx +0200] "POST /userx/index.php?m=dashboard&xxxx...

In diesem Fall sind meine Funktionen Kontakte, Kunden, Meetings und Dashboard. Ich versuche, die standardmäßige Willkommensseite zu ignorieren. Ich habe

awk '$7 !~ /m=dashboard/ ' log file

Meine Frage lautet: Kann ich weitere Funktionen ignorieren, die in einer Datei enthalten sind?

cat file:
dashboard
meeting

Um nur diese Zeilen zu haben:

195.xx.x.x - - [13/Apr/2017:09:60:xx +0200] "POST /userx/index.php?m=contacts
192.xx.x.x - - [13/Apr/2017:09:45:xx +0200] "POST /userx/index.php?m=customer

Antwort1

sed '/\//!{H;d};G;/m=\(.*\)\n.*\1/d;P;d' file log

Erklärung: Zuerst wird filemit den Filterschlüsselwörtern gelesen, dann das Logfile. Zeilen die keins enthalten /werden als Schlüsselwörter interpretiert und an das Hold Space angehängt ( H). Andere Zeilen bekommen das Hold Space angehängt ( G) und werden gelöscht, wenn das Schlüsselwort nach dem m=in der Schlüsselwortliste wiederholt vorkommt ( /m=\(.*\)\n.*\1/d). Wenn nicht, wird es ohne das angehängte Hold Space ausgedruckt ( P).

Antwort2

Da Ihre Frage jetzt mehr Sinn zu ergeben scheint, gehe ich davon aus, dass Sie nach etwas wie dem Folgenden suchen:

awk -F= 'NR==FNR{l[$NF]=1; next} { if (!l[$NF]) print;}' ignore_words your_log_file

Bearbeiten

Wie Sundeep im obigen Kommentar anmerkte, könnten Sie grep wie folgt verwenden:

grep -Fvf ignore_words log_file

Um zu sehen, wofür die Optionen -Fvfverwendet werden, konsultieren Sie bitte man grepdie Seite.

verwandte Informationen