Jump to content

Powershell Logfile mit Servername lesen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen,

 

bin neu in der Powershell Welt denke Script ist ganz simpel aber ich komme aus mangelden Kenntnissen einfach nicht weiter, folgende Herausforderung:

 

Ich habe ein Ordner "C:\Logfiles" inhalt von dem Ordner siehr folgendermaßen aus

 

Server001-perfmon.txt

Server002-perfmon.txt

Server003-perfmon.txt

 

Jede .txt enthält folgenden Inhalt:

_________________________________________________________________

## Memory-Counter 90% GBL_MEM_UTIL wurde entfernt

## S;GBL_MEM_UTIL;;>;90;1-5;06:00;21:00;00:10;critical;OS;Phys.

##

# zu Ueberwachenden Performance Kennwerte

S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys

S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys

S;GBL_CPU_TOTAL_UTIL;;>;90;1-5;06:00;21:00;00:30;warning;OS;

_________________________________________________________________

 

 

Ich muss jede .txt auslesen und nur Einträge die mit "S" anfangen rausfiltern und nicht die Einträge mit "#", das ganze dann in eine .csv ausgeben!

Schwierigkeit daran ist Servernamen "Server001-perfmon.txt" raus zu lesen und zu den Einträgen mit "S" zuzuordnen natürlich aus der richtigen .txt. Ergebnis sollte folgender maßen aussehen:

 

_________________________________________________________________

Server001;S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys

Server001;S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys

Server001;S;GBL_CPU_TOTAL_UTIL;;>;90;15;06:00;21:00;00:30;warning;OS;

Server002;S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys

Server002;S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys

Server002;S;GBL_CPU_TOTAL_UTIL;;>;90;15;06:00;21:00;00:30;warning;OS;

Server003;S;GBL_MEM_UTIL;;>;95;1-5;06:00;21:00;00:10;critical;OS;Phys

Server003;S;GBL_MEM_UTIL;;>;98;1-5;06:00;21:00;24:00;critical;Basis;Phys

Server003;S;GBL_CPU_TOTAL_UTIL;;>;90;15;06:00;21:00;00:30;warning;OS;

_________________________________________________________________

 

 

Ich bekomme mit meinem Script Daten aus .txt rausgefiltert allerdings weiß ich nicht wie ich die Servernamen zu den ausgelesenen Daten zuorde das ich auch weiß zu welchem Server diese Einträge gehören.

 

 

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

$filepath="C:\Logfiles"

$file="C:\Logfiles\perfmon.csv"

Get-ChildItem $filepath | Get-Content | Select-String -notmatch "#" | Out-File $file

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

 

 

Kann mir jemand bitte helfen, Danke.

Link zu diesem Kommentar

Ich würde das mit 2 Schleifen machen.

 

In der ersten liest du die ganzen Dateien aus und bekommst z.B. mit .split() oder .substring() (in Kombination mit .indexof() um den Servernamen vom '-perfmon.txt' zu trennen).

 

In der 2. Schleife (diese in der ersten Schleife) gehst du in jede Datei und ließt dort die Zeilen aus und bearbeitest diese und schreibst das in eine neue Datei.

 

Siehst dann ungefähr so aus (aus dem Stegreif heraus gecodet und ungetestet):

 

foreach($file in (get-childitem ....)){
  $server = $file.name.split('-')[0]
  foreach($line in (get-content $file.FullName)){
     if($line -like '#*'){
        $server + ';' + $line | out-file ... -append
     }
  }
}

Link zu diesem Kommentar

Perfekt Danke Funktioniert :)

 

ich hab nach Einträgen mit "S" gesucht habs abgeändert und funktioniert sieht folgendermaßen aus:

 

cls

 

$filepath=Get-ChildItem "C:\Logs"

$ausgabe="C:\TMP\datei.csv"

 

 

foreach($file in $filepath){

$server = $file.name.split('-')[0]

foreach($line in (get-content $file.FullName)){

if($line -like 'S*'){

$server + ';' + $line| Out-File $ausgabe -Append

}

}

}

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

 

Ich hatte einen anderen Ansatz habe aber nur Teilergebnisse rausbekommen und zwar wurden alle Einträge aus der .txt in einer line hintereinander und nicht untereinander ausgegeben als Beispiel:

 

%servername% ; %Eintrag aus txt mit S% ; %Eintrag aus txt mit S% ; usw....

%servername% ; %Eintrag aus txt mit S% ; %Eintrag aus txt mit S% ; usw....

 

wäre auch interessant zu wissen wo der Fehler war bzw. wie ich die Einträge in meinem Script untereinander rausbekomme?

 

cls

 

 

$filepath=Get-ChildItem "C:\Logs"

$ausgabe="C:\TMP\datei.csv"

$inhalte=$servernamen | Get-Content | Select-String -notmatch "#"

 

$filepath | ForEach-Object { $_.Name + ";" + $inhalte } | Out-File $ausgabe

 

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

 

 

Trotzdem Vielen Dank :)

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...