Zählen Sie Fehlermeldungen in einer Protokolldatei

Zählen Sie Fehlermeldungen in einer Protokolldatei
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:1
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:2
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:5
java.lang.NullPointerException:12
java.lang.NullPointerException:7
java.lang.NullPointerException:18
java.lang.NullPointerException:2 

Wie Sie sehen, habe ich 3 duplizierte MySQL-Fehler und ihre Häufigkeit wird am Ende angezeigt. Beim ersten Fehler erscheint 1, beim zweiten Fehler erscheint 2 und beim dritten Mal erscheint 5. Ich möchte, dass das Skript eine duplizierte Zeile mit Summe bleibt. Dasselbe mache ich für die Java-Fehler.

Erwartete Ausgabe:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:8
java.lang.NullPointerException:39

Antwort1

awk 'BEGIN{ FS=OFS=":" }
   { freq=$NF; sub(/:[^:]*$/, ""); seen[$0]+=freq }
END{ for (x in seen) print x, seen[x] }' infile

FS ist der Eingabefeldtrenner und OFS der Ausgabefeldtrenner; beide setzen wir auf einen Doppelpunkt; dann greifen wir auf das letzte Feld $NFin einer temporären Variable zu freqund entfernen anschließend das letzte Feld aus dem aktuellen Eingabedatensatz $0mithilfe der Funktion sub().

dadurch seen[$0]+=freqsummieren wir dieselben Protokollzeilen (das letzte Feld ist bereits ausgeschlossen) auf den Wert des letzten Felds, da deren Häufigkeit wir freqzuvor in der Variablen gespeichert haben.

Am ENDE führen wir dann eine Schleife über das Array aus und drucken die Zeilen, gefolgt von ihrer Gesamthäufigkeit.

verwandte Informationen