So drucken Sie Statistiken aus Zeilen in einer Datei

623
Seldaek

Oft rechne ich nach dem Filtern einer Protokolldatei manuell nach Prozentsätzen, um den Anteil von X oder Y darin zu ermitteln. Kann dies mit gängigen CLI-Tools problemlos erreicht werden?

0

1 Antwort auf die Frage

3
Seldaek

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.logist die Datei, die Sie untersuchen möchten, und Windows|Linuxeine 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.