Wie kann ich Befehle in einer Protokolldatei zählen?

588
ino

Ich habe Hunderte von Protokolldateien in einem einzigen Verzeichnis, und ich möchte eine automatisierte Methode zum Durchsuchen der Protokolldateien, um zu zählen, wie oft jeder Befehl verwendet wird.

  • Protokolldateien sind Textdateien
  • Es gibt mehr als 100 verschiedene Befehle
  • Sie beginnen alle mit "Command:" und dann mit dem Namen des Befehls.
  • Es ist eine Zeile pro Befehl
  • andere Zeilen sollten ignoriert werden

Daher würde ich gerne wissen, ob es ein Skript oder eine Software gibt, die dies tun und die Ergebnisse nach den meisten verwendeten Befehlen sortieren und die Häufigkeit jedes Befehls anzeigen. So etwas wie Statistiken.

(edit: Ich bin unter Windows XP und habe keine Probleme, Programme für diesen Zweck zu installieren.)

0
@Johannes Win XP, ich habe nie PowerShell verwendet. bearbeitete die Frage ino vor 14 Jahren 0

2 Antworten auf die Frage

2
Joey

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 -matchOperators zu unterdrücken, die immer Truehier zurückkehren würde . Wir wollen nicht nach, True barsondern 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: ([^ ]*) 
Das funktioniert gut, aber wenn "Befehl:" leer ist oder mit einem Sternchen beginnt, wird ein Fehler ausgegeben. Ansonsten ist es perfekt. irgendwelche Ideen dazu? ino vor 14 Jahren 0
@ume: Nun, ohne Details, wie genau deine Zeilen aussehen, war dies ein bisschen zu erraten. Um leere Befehle zuzulassen, ersetzen Sie das "+" im regulären Ausdruck durch ein Sternchen "*". Um mehr Zeichen zuzulassen, können Sie das "\ w" durch einen Punkt "." Ersetzen. Dies könnte jedoch zu sehr groß sein ... Wenn Leerzeichen Ihre Befehlsnamen beenden, können Sie `[^]` verwenden (beachten Sie das Leerzeichen innerhalb von Klammern) als Ersatz für "\ w". Joey vor 14 Jahren 0
0
squillman

Welches Betriebssystem?

Dies passt nicht perfekt zu Ihrer Anforderung, aber ...

grep -i -c Command *.log 

erhalten Sie die Anzahl der Vorkommen nach Dateien aufgeschlüsselt. Sie können diese Ausgabe dann analysieren, um Ihre Gesamtwerte zu erhalten. Legen Sie es in einer Textdatei ab und ziehen Sie es in Excel oder etwas anderes. Nicht sehr schwierig, aber auch nicht vollständig automatisiert. Ich finde oft, dass ich mehr Zeit damit verbringe, nach einer vollständig automatisierten Lösung zu suchen, als so etwas zu verwenden ... Sie können mit cygwin grep für Windows erhalten .