2017-07-20 2 views
0

Ich weiß, es gibt viele Fragen zu diesem Thema, die awnsered alreade sind, aber leider keine, die mir in meinem Fall geholfen: ich eine Datei server.log habe wie folgt aussehen:Split Textdatei in Powershell für Zeile und String

 
################################################## 
ServerLog 07.07.2017 1:00:02,02 
Software Version 2.5 (modified 30.06.2017 15:53) 
################################################## 


Number of clients: 4 


KB-Server is online 
--------------------------------------------------------------------- 
--------------------------------------------------------------------- 
Client 1 

current client: \\192.168.0.22\Dauerversuch01 

Connecting the network share successfull? 
client connected successfully 

No files found 
--------------------------------------------------------------------- 
--------------------------------------------------------------------- 
Client 2 

current client: \\192.168.0.23\Dauerversuch01 

Connecting the network share successfull? 
client connected successfully 


3 
Files found in the directory 

Copy from Client to local HDD: 
"\\192.168.0.23\Dauerversuch01 --> D:\Transfer" 
All files passed the md5 check 

Files won't get analysed by GlyphWorks 

copy files from hdd to server: 
"D:\Transfer --> \\mucs0244\Pool\CoC-AS\MessdatenQuantum\Dauerversuch_01_DUMMY\2017\07" 
All files passed the md5 check 

files were transfered successfully from the client to the server 


--------------------------------------------------------------------- 
--------------------------------------------------------------------- 
Client 3 

current client: \\192.168.0.24\Dauerversuch 

Connecting the network share successfull? 
client connected successfully 


3 
Files found in the directory 

Copy from Client to local HDD: 
"\\192.168.0.24\Dauerversuch --> D:\Transfer" 
All files passed the md5 check 

Files won't get analysed by GlyphWorks 

copy files from hdd to server: 
"D:\Transfer --> \\mucs0244\Pool\CoC-AS\MessdatenQuantum\Dauerversuchspruefstand_02_SL20-4\2017\07" 
All files passed the md5 check 

files were transfered successfully from the client to the server 


--------------------------------------------------------------------- 
--------------------------------------------------------------------- 
Client 4 

current client: \\192.168.0.25\Dauerversuch01 

Connecting the network share successfull? 
client connected successfully 


3 
Files found in the directory 

Copy from Client to local HDD: 
"\\192.168.0.25\Dauerversuch01 --> D:\Transfer" 
All files passed the md5 check 

Files won't get analysed by GlyphWorks 

copy files from hdd to server: 
"D:\Transfer --> \\mucs0244\Pool\CoC-AS\MessdatenQuantum\Dauerversuch_01_DUMMY2\2017\07" 
All files passed the md5 check 

files were transfered successfully from the client to the server 



--------------------------------------------------------------------- 
--------------------------------------------------------------------- 
Batch erfolgreich beendet 

Wahrscheinlich schon erraten, möchte ich die server.log in Client-Logs aufteilen. Um genau zu sein möchte ich mein PowerShell-Skript mit einer Client-Nummer als Eingabeparameter ausführen können, das Skript sollte dann zB ausgeben. client2.log wie folgt aussehen:

 
--------------------------------------------------------------------- 
Client 2 

current client: \\192.168.0.23\Dauerversuch01 

Connecting the network share successfull? 
client connected successfully 


3 
Files found in the directory 

Copy from Client to local HDD: 
"\\192.168.0.23\Dauerversuch01 --> D:\Transfer" 
All files passed the md5 check 

Files won't get analysed by GlyphWorks 

copy files from hdd to server: 
"D:\Transfer --> \\mucs0244\Pool\CoC-AS\MessdatenQuantum\Dauerversuch_01_DUMMY\2017\07" 
All files passed the md5 check 

files were transfered successfully from the client to the server 


--------------------------------------------------------------------- 

Das Beste, was ich ist dieses kleine Skript

$file = (GC H:\server.log) 
foreach ($line in $file) { 
    if ($line -match "^Client \w+") { 
    $newfile = "$($line.Split(' ')[1]).txt" 
    } else { 
    $line | Out-File -Append $newfile 
    } 
} 

tun konnte, aber diese nicht richtig funktionieren und für die „----“ Linien der Suche funktioniert nicht .

+0

Vielleicht sollten Sie die Protokollierung der Software ändern, die Sie verwenden, um diese stattdessen zu erstellen? Parsing Freeform Textdateien ist ein echter Schmerz. – Vesper

+0

Nicht wirklich möglich leider, aber ich könnte die Software ändern, um sagen wir nur eine "--------" Zeile, aber ich habe keine Idee, wie man es dann entweder ... –

+0

"(? S) (? = Client \ s \ d). *? (? = ---) "sollte mit dem vollständigen Block für einen Client übereinstimmen. Dann, wenn ich mich nicht falsch erinnere, werden die Übereinstimmungen im Array (?) $ Match sein, durchlaufen Sie es und schreiben Sie das Protokoll basierend auf der ersten Zeile in der Übereinstimmung. _ (wahrscheinlich eine schönere Art, die Regex zu schreiben) _ – Jonas

Antwort

2

Verwenden Select-String die Client-Abschnitte von Ihrem Server-Log auf einzelne Client-Log-Dateien zum Extrahieren:

$serverlog = 'H:\server.log' 
$re = '(?ms)----+\r?\n(Client \d+)[\s\S]*?----+' 

Select-String -Path $serverlog -Pattern $re -AllMatches | 
    Select-Object -Expand Matches | 
    ForEach-Object { 
     $clientlog = 'C:\path\to\{0}.log' -f $_.Groups[1].Value 
     $_.Groups[0].Value | Set-Content $clientlog 
    } 
0

der Kunden Zahl von 1 bereitgestellt und aufeinander folgend ist,
dieses Skript übernimmt Protokolle im aktuellen Ordner sein:

$Splitter='-'*69 
$ClientLogs =(Get-Content .\server.log -raw) -split "$Splitter`r?`n$Splitter" 
For ($i=1; $i -lt $ClientLogs.Count-1; $i++){ 
    Set-Content -Path (".\Client_$i.log") -Value $ClientLogs[$i] 
}