Mit Windows PowerShell können Sie Folgendes tun:
Get-Content *.log | Where-Object { $_.StartsWith('Command:') } | Group-Object { $null = $_ -match '^Command: (\w+)'; $Matches[1] } | Select-Object Name,Count
Für meine Testdatei ergibt dies eine Ausgabe wie
Name Count ---- ----- foo 2 bar 2 baz 1
Der obige Code liest die Protokolldateien einfach Zeile für Zeile, drückt jede Zeile durch die Pipeline und filtert dann die Zeilen, um nur die Zeilen zu verwenden, die mit "Command:" beginnen, was einen folgenden Befehl angibt. Diese Zeilen werden dann zu den einzelnen Befehlen zusammengefasst. Dies geschieht durch den regulären Ausdruck
^Command: (\w+)
die mit der Zeichenfolge "Command:" am Anfang der Zeile übereinstimmt, gefolgt von einem oder mehreren Wortzeichen. Es wird davon ausgegangen, dass der Befehlsname unmittelbar dem Doppelpunkt und dem Leerzeichen folgt. Passen Sie den Regex entsprechend an, wenn dies nicht der Fall ist. Der Befehlsname wird in einer Capture-Gruppe erfasst, die zur Gruppierung verwendet wird. Danach werden nur der Name und die Häufigkeit der Befehle ausgewählt.
Der $null =
Teil für die Übereinstimmung besteht darin, die Ausgabe des -match
Operators zu unterdrücken, die immer True
hier zurückkehren würde . Wir wollen nicht nach, True bar
sondern nur nach gruppieren bar
.
ETA: Abhängig davon, wie genau Ihre Eingabe aussieht, möchten Sie die Dinge vielleicht ein bisschen optimieren.
Leere Befehle zulassen:
^Command: (\w*)
Zulassen von beliebigen Leerzeichen in Befehlsnamen (und leeren Befehlen):
^Command: ([^ ]*)