h41msh1c0r
Goto Top

Powershell Text Log zerlegen mit Regex

Hi in die Runde,

folgende LogStruktur:
04.01.2018 07:34:00 (u:benutzer) : Success ( Execution Package - Install )
04.01.2018 07:33:00 (u:benutzer) : Start ( Execution Package - Install  )
04.01.2018 07:32:00 (u:benutzer) : !ABORT! ( Execution Package - Install )
04.01.2018 07:31:00 (u:benutzer) : Start ( Execution Package - Install )

und wieder ein kleiner Nebenkriegsschauplatz. ;(

Jetzt will ich die einzelnen Bestandteile aufteilen und am Ende eine Liste von Objekten füllen um darin mir Ergebnisse rauszuziehen.

Jedes Object hat:

$Datum
$Benutzername
$Status (Success oder Start oder !ABORT!)

Status geht.

Datum funktioniert auch:
$Datum = $_ -match '\d..\S+\S+\s'  

Der Match für den Benutzernamen will noch nicht:
$_ -match '\((.*)\)'  

Hier hört er nach dem ersten ")" nicht auf sondern nimmt den gesammten Rest der Zeile.

Die Zeichenlänge des Benutzernamens ist nicht immer gleich daher ist es schon wichtig das die ")" als Ende gefunden wird.

2te Variante mag auch nicht:

$_ -match '^[a-z]{1,4}[0-9]{1,5}$'  

Die Benutzernamen setzen sich immer aus 4 Buchstaben und 1-5 Zahlen zusammen.

Wo hab ich hier den Knoten?

VG

Content-Key: 368930

Url: https://administrator.de/contentid/368930

Ausgedruckt am: 19.03.2024 um 03:03 Uhr

Mitglied: colinardo
Lösung colinardo 22.03.2018 aktualisiert um 15:48:33 Uhr
Goto Top
Servus.
Bidde face-wink.
[regex]::matches((gc 'C:\logdatei.log' -raw),'(?im)^([\d\s\.:]+)\(u:([^\)]+)\)\s*:\s*([^\s]+)').Captures | %{[pscustomobject]@{Datum=get-date $_.Groups[1].Value;Benutzername=$_.Groups[2].Value;Status=$_.Groups[3].Value}}  
Grüße Uwe
Mitglied: H41mSh1C0R
H41mSh1C0R 22.03.2018 um 15:53:39 Uhr
Goto Top
Dankööö Uwe

*gleich wieder unter merken merken ^^ + Report Script fertig schrauben*

VG
Mitglied: H41mSh1C0R
H41mSh1C0R 22.03.2018 um 16:50:25 Uhr
Goto Top
Noch eine kleine Frage:

Jetzt wollte ich mir einen Filter definieren der mit ein Zeitfenster aus der ausgelesenen Menge wieder gibt:
$Result = [regex]::matches((gc 'C:\logdatei.log' -raw),'(?im)^([\d\s\.:]+)\(u:([^\)]+)\)\s*:\s*([^\s]+)').Captures | %{[pscustomobject]@{Datum=get-date $_.Groups[1].Value;Benutzername=$_.Groups[2].Value;Status=$_.Groups[3].Value}}  

[datetime]$Zeitraum_Anfang = "06.12.2017"  
$Zeitraum_Anfang.ToString("dd.MM.yyyy")  

[datetime]$Zeitraum_Ende   = "08.12.2017"  
$Zeitraum_Ende.ToString("dd.MM.yyyy")  

$Result | Where-Object {(($_.Datum).toString("dd.MM.yyyy") -lt $Zeitraum_Anfang) -and (($_.Datum).toString("dd.MM.yyyy") -gt $Zeitraum_Ende)}   

Als Ausgabe bekomme ich allerdings folgendes:

12.06.2017
12.08.2017

Lasse ich das "-and (($_.Datum).toString("dd.MM.yyyy") -gt $Zeitraum_Ende)" weg bekomme ich die Ausgabe der Einträge die halt -lt $Zeitraum_Anfang sind.

Warum?

VG
Mitglied: colinardo
Lösung colinardo 22.03.2018 aktualisiert um 16:59:16 Uhr
Goto Top
Warum?
Weil du mein Datum (was ich in dem Custom Object übrigens bereits zu einem "echten" Datums-Object konvertiert habe face-wink) im Vergleich mit toString() zu einem String konvertierst und Strings miteinander mit größer kleiner vergleichst, das kann ja nich min Jung face-smile. Du kannst die Spalte also direkt mit Datumsobjekten vergleichen ohne irgendwelche Umwege!
Mitglied: H41mSh1C0R
H41mSh1C0R 22.03.2018 aktualisiert um 17:07:53 Uhr
Goto Top
hmmmmmmm

[datetime]$Zeitraum_Anfang = "01.01.2018"  
[datetime]$Zeitraum_Ende   = "01.03.2018"  
$Result | Where-Object { ($_.Datum -gt $Zeitraum_Anfang) -and ($_.Datum -lt $Zeitraum_Ende) } 

Solange ich das "-and" dazwischen habe macht er 0 Ausgabe, ohne gibts was. Je nachdem ob -lt oder -gt gibts den Block drüber oder unter dem Datum.
Mitglied: colinardo
Lösung colinardo 22.03.2018 aktualisiert um 17:20:40 Uhr
Goto Top
Ich glaub da ist wieder n' Kaffee fällig ... face-smile
$min = get-date '01.01.2018'  
$max = get-date '01.03.2018'  
$result = [regex]::matches((gc 'C:\logdatei.log' -raw),'(?im)^([\d\s\.:]+)\(u:([^\)]+)\)\s*:\s*([^\s]+)').Captures | %{[pscustomobject]@{Datum=get-date $_.Groups[1].Value;Benutzername=$_.Groups[2].Value;Status=$_.Groups[3].Value}}  
$result | ?{$_.Datum.Date -ge $min -and $_.Datum.Date -lt $max}
btw. beachte auch die Zeiten face-wink.

Gut's nächtle (bin ein paar Zeitzonen voraus).
Mitglied: H41mSh1C0R
H41mSh1C0R 22.03.2018 um 17:20:36 Uhr
Goto Top
Kaffee ist die ganze Zeit schon fällig, aber Kaffee steht seit 1.1. leider auf der Abschussliste. (Ernährungsumstellung)

[datetime]$Zeitraum_Anfang = "01.04.2018"  
[datetime]$Zeitraum_Ende   = "02.06.2018"  

$Result | Where-Object {($_.Datum -gt $Zeitraum_anfang) -and ($_.Datum -lt $Zeitraum_Ende) }

Wenn ich das so schreib ist mir aufgefallen das er das Datum der Variablen in umgekehrter Schreibweise nutzt.
Sprich 01.04. steht für 4. Jan und 02.06. für 6. Feb.

Aber jetzt gehts erstmal in den Stadtverkehr und dann gibts einen Ingwer Tee.

*Kaffee brüh* --> *rüberschieb*

Dankööö und dir schonmal einen schönen Feierabend
Mitglied: colinardo
Lösung colinardo 22.03.2018 aktualisiert um 17:30:12 Uhr
Goto Top
Sprich 01.04. steht für 4. Jan und 02.06. für 6. Feb.
Stichwort "Culture" ! Du bist sehr wahrscheinlich auf einem englischen System und dort sind Monat und Tag getauscht interpretiert, du kannst das aber bei der Umwandlung in ein Datum definieren.

Guckst du
[datetime]::Parse("01.03.2018",[cultureinfo]'de')  
Mitglied: H41mSh1C0R
H41mSh1C0R 22.03.2018 um 17:59:25 Uhr
Goto Top
notiert

=)