2016-04-28 20 views
0

Ich habe eine Logdatei mit vielen Einträgen. Einige von ihnen beginnen mit einem Datum, andere nicht. Ich möchte alle Einträge aus diesem/letzten Monat mit "UpgradeResource] part: 3-V12345678-12-" in der Zeile suchen und die Ergebnisse nach Box gruppiert zählen. Eigentlich gibt es 9 Boxen, die von 1 bis 9 zählen, aber wenn wir eine andere Box kaufen, gibt es eine 10 oder 11 & hellip; Auf den Box-Zähler folgt immer -1 am Ende der Zeile.Suche und gruppieren von Logfile

Die Zeilen, die ich für aussehen wie diese suchen:

2016-04-27 11:49:43,895 INFO [ajp-apr-8009-exec-9] [com.xxx.shared.yyy.UpgradeResource] part: 3-V12345678-12-5-245, box: 3-V12345678-38-3-1 
... 
2016-04-27 11:49:43,895 INFO [ajp-apr-8009-exec-9][com.xxx.shared.yyy.UpgradeResource] part: 3-V12345678-12-4-112, box: 3-V12345678-38-1-1

Mein Ergebnis-Ausgabe sollte sein:

Month 03/2016: 
Box 1: 10 times 
Box 2: 123 times 
Box 3: 65 times 

Month 04/2016: 
Box 1: 75 times 
Box 2: 13 times 
Box 3: 147 times

Ich bin nicht sehr fest im Umgang mit Powershell und versucht, dies aber Fehler bekommen und denken ich bin nicht auf dem richtigen Weg:

$inputfile = "C:\temp\result.txt" 
$matchstring = "(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(?.*?), box: 3-V12345678-38-(\d{1})-1" 
Get-Content $inputfile | foreach { 
    if ($_ -match $matchstring) { 
     "" | select @{n='Date';e={$matches.date}},@{n='Key';e={$matches.Key}},@{n='PD';e={$matches.PD}} 
    } 
} 

der Fehler erhalte ich:

"(?\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 
3-V12345678-12-(?.*?), box: 3-V1001686-38-(\d{1})-1" wird analysiert - 
Unbekanntes Gruppierungskonstrukt. 
In C:\temp\count.ps1:16 Zeichen:6 
+ if ($_ -match $matchstring) 
+  ~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo : OperationStopped: (:) [], ArgumentException 
    + FullyQualifiedErrorId : System.ArgumentException
+0

Sie können Ihre regex in einem Tool wie https://regex101.com/ testen. Es gibt einige "?" In deinem Matchstring, die nicht akzeptiert werden. – Martin

Antwort

0

Der Fehler Sie bekommen ist, weil (?...) keine gültige Gruppierung Konstrukt ist. Wenn Sie benannte Gruppen verwenden möchten (was der Rest Ihres Codes andeutet), muss auf das Fragezeichen der Gruppenname in eckigen Klammern folgen ((?<name>...)). Für eine nicht einfangende Gruppe muss ein Doppelpunkt folgen ((?:...)). Weitere Informationen finden Sie unter here.

Der Code sollte wohl etwas wie folgt aussehen:

$inputfile = 'C:\temp\result.txt' 
$matchstring = '(?<date>\d{4}-\d{2}-\d{2}) (?<time>\d{2}:\d{2}:\d{2})' + 
       '.*UpgradeResource] ' + 
       'part: 3-V12345678-12-(?<Key>.*?), ' + 
       'box: 3-V12345678-38-(?<PD>\d{1})-1' 
Get-Content $inputfile | Where-Object { 
    $_ -match $matchstring 
} | ForEach-Object { 
    New-Object -Type PSObject -Property @{ 
    'Date' = $matches.date 
    'Time' = $matches.time 
    'Key' = $matches.Key 
    'Box' = 'Box ' + $matches.PD 
    } 
} | Group-Object Date, Box 
0

Passt das?

$inputfile = "C:\temp\result.txt" 
$matchstring = "(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*UpgradeResource] part: 3-V12345678-12-(.*), box: 3-V12345678-38-(\d{1})-1" 

Get-Content $inputfile | foreach { 
if ($_ -match $matchstring) { 

    "" | select @{n='Date';e={$matches.1}},@{n='Key';e={$matches.2}},@{n='PD';e={$matches.3}} 
} 

}

gibt mir diese Ausgabe:

Date             Key              PD              
----             ---              --              
2016-04-27 11:49:43          5-245             3              
2016-04-27 11:49:43          4-112             1 
+0

Ja, das funktioniert. Und jetzt, wie zähle ich und gruppiere ich durch PD? Und wie kann ich Ergebnisse für diesen/letzten Monat gruppiert bekommen? – marchusar

+0

Sie können ein '| hinzufügen Gruppe pd' zum '" "| Wählen Sie ..'Linie für die Gruppierung nach PD. Die Gruppierung nach Monat erfordert etwas mehr String-Operation, da ein Gruppendatum nach dem genauen Datum gruppiert wird. – Martin

+0

OK, ich werde mehr Dinge versuchen. Ich habe jetzt gesehen, dass es viele Einträge mit demselben Zeitstempel gibt. Ich muss herausfinden, wie ich nur einen Eintrag mit dem gleichen Zeitstempel zählen kann. – marchusar