Suchen der Zeilennummern von Ausnahmezeilen in der Protokolldatei

Suchen der Zeilennummern von Ausnahmezeilen in der Protokolldatei

Ich schreibe ein Shell-Skriptprogramm, um einige Ausnahmen aus einer Protokolldatei zu extrahieren und einige Verarbeitungen durchzuführen. Derzeit verwende ich den folgenden Befehl in meinem Skript, um die Zeilennummern in der Protokolldatei zu erfassen, die eine Ausnahme aufweisen. Die Ausnahmezeilen enthalten ERRORden Schlüssel direkt nach Datum und Zeitstempel

lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))

Beim Testen des aktuellen Skripts ist mir aufgefallen, dass einige Protokolleinträge FEHLER und Ausnahmen in derselben Zeile enthalten, was aber nicht die Art von FEHLER ist, nach der ich suche (Beispielzeile 5). Ich möchte mein Skript so ändern, dass es nur Zeile 3 im folgenden Beispielprotokoll zurückgibt.

2016-10-21 15:25:37,231 INFO Processinng current row  
2016-10-21 15:25:37,231 INFO com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 ERROR com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 DEBUG com.test.main com.test.controller.CrashException: 
2016-10-21 15:25:37,231 DEBUG Processing row with ERROR and Exception 
2016-10-21 15:25:37,231 DEBUG processed row 1: 

Antwort1

ERRORWenn Sie die Zeilen mit den Wörtern und erhalten möchten Exception, versuchen Sie:

grep -E "ERROR.*Exception" $file

Antwort2

Wenn Sie awkanstelle von verwenden grep, können Sie nicht nur die Zeilennummern drucken (genauer gesagt,Rekordzahlen) direkt, sondern testen Sie auch bestimmte durch Leerzeichen getrennte Felder einzeln, z. B.

awk '$3 == "ERROR" && /Exception/ {print NR}' logfile

oder (noch genauer: Beschränkung der Übereinstimmung Exceptionauf das letzte Feld)

awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile

Antwort3

cat thelogfile.log | nl -ba | grep "ERROR"

Dadurch wird die Datei an nl weitergeleitet, um die Zeilen zu nummerieren. Anschließend wird mit grep nach Fehlerzeilen gefiltert. Wenn Sie nur die Fehlerzeilennummern möchten, fügen Sie awk '{print $1}' hinzu. Auch cat kann Zeilennummern mit dem Flag -n verwenden, aber ich bevorzuge nl.

Beispiel für eine Array-Variable mit Zeilennummern mit Fehlern;

linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))

Bearbeiten:

ps das grep kann sein;

grep ",[0-9]* ERROR"

Antwort4

Verwenden spezifischerer regulärer Ausdrücke:

grep '^[0-9, :-]\+ERROR' "$file"

verwandte Informationen