Ich möchte ein Logfile in Teile aufteilen und dann in diesen Teilen nach Fehlern suchen. Wenn ein Fehler auftritt, möchte ich den entsprechenden Teil des Logfiles in eine andere Datei packen.
Kleines Beispiel:
Die Logdatei sieht folgendermaßen aus:
STARTLOG1
blabla
more_blabla
ENDLOG1
STARTLOG2
FEHLER: Fehlertext
Dies ist ein Fehler
von Benutzer XYZ
ENDLOG2
STARTLOG3
blabla
more_blabla
ENDLOG3
Ich möchte die Protokolldatei in Abschnitte aufteilen. Alle Zeilen zwischen STARTLOG und ENDLOG sollten ein Abschnitt sein. Wenn in einem Abschnitt ein Fehler auftritt, extrahieren Sie den gesamten Abschnitt in eine Datei. Die Datei sollte folgendermaßen aussehen:
STARTLOG2
FEHLER: Fehlertext
Dies ist ein Fehler
von Benutzer XYZ
ENDLOG2
Antwort1
Versuche dies:
$ awk -v RS="STARTLOG" '/ERROR/{print RS$0; }' log
STARTLOG2
ERROR: Errortext
This is an Error
from user XYZ
ENDLOG2
Um zu einer Datei mit dem Namen umzuleiten, logN
wobei N die Nummer von ist STARTLOG
, verwenden Sie:
gawk -v RS="STARTLOG" '/ERROR/{print RS$0 > "log"$1; }' log
Erläuterung
RS
ist das Datensatztrennzeichen, es definiert, wofür eine „Zeile“ steht awk
. Hier stelle ich es auf ein, STARTLOG
damit der gesamte Datensatz als einzelne Zeile behandelt wird. Wenn diese „Zeile“ dann enthält ERROR
, drucke ich STARTLOG
(das RS
, dies dient nur dazu, dasselbe Format wiederherzustellen).
Sie können den gleichen Ansatz auch mit Perl verwenden:
perl -lne 'BEGIN{$/="STARTLOG"}{print "$/$_" if /ERROR/}' log