2017-10-29 5 views
1

Ich muss Log-Datei analysieren, so dass ich die Fehler (mit dem Stack-Trace unten) und 10 Zeilen über jeden Fehler ausgeben.Wie kann ich 10 Zeilen über und bis zu einem passenden Wort unten für jede passende Zeile drucken?

Zum Beispiel:

2017-10-29 00: 00: 10.440 INFO ...
2017.10.29 00: 00: 10.473 WARN ...
2017.10.29 00 : 00: 10.504 INFO ...
2017-10-29 00: 00: 10,547 INFO ...
2017-10-29 00: 00: 10.610 INFO ...
2017-10-29 00:00 : 11,176 WARN ...
2017-10-29 00: 00: 11.894 WARN ..
2017-10-29 00: 00: 11.900 INFO ...
2017.10.29 00: 00: 11.900 INFO ...
2017.10.29 00: 00: 12.632 Warn ...
2017.10.29 00: 00: 12.946 ERROR ...
... (Stack trace) ...
... (Stack trace) ...
... (Stack trace) ...

2017.10.29 00: 00: 12.946 WARN

Ich muss 10 Zeilen über den FEHLER bis zum Datum (2017-10-29) unten ausgeben (ohne die Zeile des Datums)

Dachte über tun mit grep -n -B10 "ERROR" (für die obigen 10 Zeilen) und sed '/ ERROR /,/29/p' (für den Stack-Trace) aber wie kombiniere ich die beiden?

+0

kann ich nicht denken Sie an einen Weg, sie zu kombinieren, aber es wäre relativ einfach sein, schreibe ein Bash-Skript, um dies als eigenständige Aufgabe zu tun, ohne grep oder sed zu verwenden. – Nick

Antwort

1

Mit grep + head Pipeline:

grep -B10 'ERROR' g1 | head -n -1 
+0

@RomanPerekruh, Wird es funktionieren, wenn ich viele Fehler in der Protokolldatei habe? Ich denke Kopf wird nur die letzte Zeile auf den Daten piped .. Bin ich falsch? –

+0

@RuthieZ, Sie haben nicht erwähnt, dass Sie * viele Fehler in der Protokolldatei haben * – RomanPerekhrest

+0

Diese 'Grep | head 'druckt die Stack-Trace-Zeilen nicht, unabhängig von der Anzahl der Fehler in der Datei. Die Frage bezieht sich sowohl auf die letzten zehn Zeilen als auch auf die zu extrahierende Fehlerstack-Ablaufverfolgung. – thanasisp

0

Dies könnte für Sie (GNU sed) arbeiten:

sed -n ':a;N;/ERROR/bb;s/[^\n]\+/&/11;Ta;D;:b;p;n;/2017-10-29$/!bb' file 

höchstens 10 Zeilen in dem Musterraum Sammelt dann verwenden Diese Zeilen verschieben das Fenster durch die Datei. Wenn die Zeichenfolge gefunden wird, drucken Sie das Fenster und dann alle weiteren Zeilen, bis (aber nicht) die Zeichenfolge 2017-10-29 übereinstimmt. Wiederholen Sie dies bei Bedarf.

+0

Muss ich sed GNU in mein Java (SVN) Projekt herunterladen, um es zu benutzen? –

0

hier ist ein Weg, awk mit:

awk '      {a[++b]=$0} 
    /^([0-9]{2,4}-?){3}/ {f=0} 
    /ERROR/    {f=1; for(i=NR-10;i<NR;i++) print a[i]} 
    f' file 

wir jede Zeile Array speichern. Wenn eine Datumsprotokollzeile abgeglichen wird, wird das Flag deaktiviert. Beim Vergleich von ERROR setzen wir das Flag und wir drucken die letzten 10 Zeilen des Arrays. Und wenn Flag aktiviert ist, drucken wir (Standardaktion, so dass wir nur f geschrieben haben)

Dies sollte die erwarteten Zeilen für alle vorhandenen Fehler in der Datei drucken.

hinweis: das datum regexp verwendet ist nicht streng, aber scheint genug für den fall.

0

Versuchen Sie dieses

grep -no -B10 ' [0-9:,]* ERROR.*' infile 

Brauchen vielleicht Ersatz ‚‘ durch [[: blank:]]

Verwandte Themen