Normalerweise identifiziere ich einige Merkmale in einer Protokolldatei, von denen ich unterscheiden möchte, und erhalte Prozentsätze davon. Dies kann leicht mit sed erledigt werden, indem Sie alles ersetzen, was Sie nicht in jeder Zeile benötigen, und dann das Vorkommen jeder Zeile zählen. Um beispielsweise zwischen Linux- und Windows-Treffern in einer Protokolldatei zu unterscheiden, können Sie Folgendes tun:
$ cat some.log | sed -r 's/.*(Windows|Linux).*/\1/' | sort | uniq -c | sort -rn 23940 Windows 12390 Linux
Damit erhalten Sie die absolute Zählung für jedes Merkmal, nach dem Sie suchen, aber nicht den Prozentsatz. Daher ist es noch nicht ideal.
Es scheint, dass awk nicht einfach zweimal über die Zeilen laufen kann, um zuerst die Gesamtsumme und dann die Prozentsätze für die Ausgabe zu berechnen. Mit einem kleinen Hack können wir jedoch zuerst eine Zeile hinzufügen, die die Summe aller übereinstimmenden Merkmale zeigt:
$ ... | awk ' END ' Total 36330 Windows 23940 Linux 12390
Nun, da wir die Gesamtmenge haben, können wir Prozentsätze einfach berechnen und drucken:
$ ... | awk '!max' Total 36330 100.00% Windows 23940 65.90% Linux 12390 34.10%
Der kombinierte Einliner wäre dann:
cat some.log | sed -r 's/.*(Windows|Linux).*/\1/' | sort | uniq -c | sort -rn | awk ' END ' | awk '!max'
Wo some.log
ist die Datei, die Sie untersuchen möchten, und Windows|Linux
eine durch Pipe getrennte Liste von Begriffen, die auf / unterscheidbar sind.
Wenn Sie die Total-Zeile am Ende entfernen möchten, da sie unwichtig ist, können Sie sie anfügen | tail -n +2
.