![Zählen Sie Fehlermeldungen in einer Protokolldatei](https://rvso.com/image/192214/Z%C3%A4hlen%20Sie%20Fehlermeldungen%20in%20einer%20Protokolldatei.png)
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 $NF
in einer temporären Variable zu freq
und entfernen anschließend das letzte Feld aus dem aktuellen Eingabedatensatz $0
mithilfe der Funktion sub().
dadurch seen[$0]+=freq
summieren wir dieselben Protokollzeilen (das letzte Feld ist bereits ausgeschlossen) auf den Wert des letzten Felds, da deren Häufigkeit wir freq
zuvor 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.