
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 ERROR
den 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
ERROR
Wenn Sie die Zeilen mit den Wörtern und erhalten möchten Exception
, versuchen Sie:
grep -E "ERROR.*Exception" $file
Antwort2
Wenn Sie awk
anstelle 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 Exception
auf 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"