eichhorn63
Goto Top

Batch soll Informationen aus Logfiles auslesen

Hallo,

Ich bin neu im Forum und habe folgende Frage:
Aus mehreren, jeweils über 1000 Zeilen großen Logfiles sollen Zeilen herausgefiltert werden,
die ein bestimmtes Wort enthalten. Im u.g. Beispiel das Wort "interneNummer".
Aus diesen Zeilen sollen darin enthaltene Werte (Datum, Uhrzeit und die entsprechende Nummer) sowie ein Teil des Dateinamens
in eine Ausgabedatei (csv) geschrieben werden.

Beispiel anhand von 2 Logdateien:

Datei 1
Name: 000123Log00-12-undsoweiter.log
Inhalt:
...
2015-08-07 13:35:15.791 [S] INFO [23] interneNummer=7,
...
2015-08-07 13:52:46.612 [S] INFO [23] interneNummer=8,
...


Datei 2
Name: 000456Log00-58-undsoweiter.log
Inhalt:
...
2015-09-23 18:01:44.198 [S] INFO [23] interneNummer=42,
...
2015-09-24 08:33:56.007 [S] INFO [23] interneNummer=4711,
...
2015-09-27 12:17:29.851 [S] INFO [23] interneNummer=42,
...

(... = weitere Zeilen mit beliebigem Inhalt)

Als gewünschtes Ergebnis soll eine Ausgabedatei mit folgenden Inhalt entstehen:
000123 2015-08-07 13:35:15 7
000123 2015-08-07 13:52:46 8
000456 2015-09-23 18:01:44 42
000456 2015-09-24 08:33:56 4711
000456 2015-09-27 12:17:29 42

Mit folgendem Batch habe ich bereits die Zeilen extrahiert, die den Suchbegriff enthalten
und den Dateinamen vorangestellt:
@echo off
setlocal 
set "OutFile=ergebnis.txt"   
set "InFiles=*.log"   
set "SearchPattern=interneNummer"   
(for %%f in ("%InFiles%") do (   
   for /f "tokens=* delims=" %%l in ('findstr /i /c:"%SearchPattern%" "%%f"') do (   
     echo %%f      %%l 
   ) 
)) > "%OutFile%"  

Ergebnis:

000123Log00-12-undsoweiter.log 2015-08-07 13:35:15.791 [S] INFO [23] interneNummer=7,
000123Log00-12-undsoweiter.log 2015-08-07 13:52:46.612 [S] INFO [23] interneNummer=8,
000456Log00-58-undsoweiter.log 2015-09-23 18:01:44.198 [S] INFO [23] interneNummer=42,
000456Log00-58-undsoweiter.log 2015-09-24 08:33:56.007 [S] INFO [23] interneNummer=4711,
000456Log00-58-undsoweiter.log 2015-09-27 12:17:29.851 [S] INFO [23] interneNummer=42,

Es fehlt jedoch noch eine Filterung, um das o.g. gewünschte Ergebnis zu erhalten.
Kann mir jemand sagen ob, und wenn ja, wie dies mit einem Batch möglich ist?
Über Antworten würde ich mich freuen.

Gruß Eichhorn63

[Edit Biber] Codeformatierung. [/Edit]

Content-Key: 297813

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

Printed on: April 24, 2024 at 14:04 o'clock

Member: TlBERlUS
TlBERlUS Mar 02, 2016 at 07:53:03 (UTC)
Goto Top
Guten Morgen,

wenn ich dich richtig verstehe, willst du
[S] INFO [23] interneNummer=42, 

nicht ausgegeben haben?

Dann müsstest du doch prinzipiell nur den Ausgabe-String kürzen.
Mitglied: 126919
126919 Mar 02, 2016 updated at 16:14:35 (UTC)
Goto Top
Mit Powershell ein Klacks
gci 'c:\quelle\*.log' | %{  
    $fnumber = $_.Basename -replace '^(\d+).*','$1'  
    [regex]::matches((gc $_.Fullname | out-string), '(?im)^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*?interneNummer=(\d+)') | select -Expand Captures | %{"$fnumber $($_.Groups[1].Value) $($_.Groups[2].Value)"}  
} | out-file 'c:\ergebnis.txt'  

Gruß fk
Member: Eichhorn63
Eichhorn63 Mar 02, 2016 at 10:40:17 (UTC)
Goto Top
Hallo TIBERIUS,
es soll nicht einfach etws abgeschnitten werden, sondern es sollen nur bestimmte Abschnitte der Ausgabezeilen verwendet werden.
So soll von der Zeile
000456Log00-58-undsoweiter.log 2015-09-27 12:17:29.851 [S] INFO [23] interneNummer=42,
z.B. nur
000456 2015-09-27 12:17:29 42
übrigbleiben.
Um dies zu erreichen würde ich von Hand folgendes tun:
Kopiere die ersten 6 Zeichen der Zeile, kopiere dann den String zwischen ".log " und "." und kopiere schließlich den String (die Zahl) zwischen "=" und ",". Die "Keywords", zwischen denen sich die zu kopierenden Strings befinden, sind immer vorhanden. Der restliche Inhalt kann unterschiedlich (auch unterschiedlich lang) sein.
Die Ergebnisdatei möchte ich dann als .csv in Excel einlesen und weiterverarbeiten (sortieren usw.)

Hallo Flachkoepper,
ih habe dein Script als test.ps1 gespeichert und ausgeführt. Zunächst gab es den Fehler
Out-File : Der Zugriff auf den Pfad "C:\ergebnis.txt" wurde verweigert.
Daraufhin habe ich den Pfad der Ergebnisdatei auf "c:\quelle" gesetzt. Die Fehlermeldung ist nun weg.
Allerdings erscheint bei der Ausführung nun folgende Fehlermeldung:

In einem NULL-Array kann kein Index erstellt werden.
Bei C:\quelle\test.ps1:4 Zeichen:11
+ $_.Groups[ <<<< 1].Value
+ CategoryInfo : InvalidOperation: (1:Int32) , RuntimeException
+ FullyQualifiedErrorId : NullArray
...
(und drei weitere fast identische Blöcke)
In der Ergebnis-Datei steht nur:
000123
000456

Die Ursache ist für mich nicht zu ermitteln. Kannst du helfen?
Mitglied: 126919
Solution 126919 Mar 02, 2016 updated at 18:18:34 (UTC)
Goto Top
Zitat von @Eichhorn63:

Zunächst gab es den Fehler
Out-File : Der Zugriff auf den Pfad "C:\ergebnis.txt" wurde verweigert.
Logisch, man sollte hier ja auch erwarten können das man den Zielpfad an seine Gegebenheiten anpasst und nicht blind Copy n Paste macht face-confused
Allerdings erscheint bei der Ausführung nun folgende Fehlermeldung:

In einem NULL-Array kann kein Index erstellt werden.
Bei C:\quelle\test.ps1:4 Zeichen:11
+ $_.Groups[ <<<< 1].Value
+ CategoryInfo : InvalidOperation: (1:Int32) , RuntimeException
+ FullyQualifiedErrorId : NullArray
...
(und drei weitere fast identische Blöcke)
In der Ergebnis-Datei steht nur:
000123
000456

Die Ursache ist für mich nicht zu ermitteln. Kannst du helfen?
Dann hat deine Textdatei vermutlich eine minimal andere Formatierung, leider hast du in deinem Post keine Codetags verwendet so das man eventuelle Sonderzeichen nicht erahnen kann face-sad

Hier läuft das einwandfrei. Also wird deine Logdatei das Problem sein oder du verwendest noch die vollkommen veraltete Powershell 2.0, wenn ja -> Update!
Member: Eichhorn63
Eichhorn63 Mar 02, 2016 at 16:07:10 (UTC)
Goto Top
Hallo Flachkoepper,
ich bin begeistert. Wie von dir vermutet, hatte ich die Powershell Version 2.0. Nach Update auf 4.0 funktioniert das Script wie gewünscht.
Etwas Feintuning könnte man evtl. noch vornehmen. Wenn der Suchbegriff in einer Datei nicht vorkommt, gibt es eine Fehlermeldung und in der Ausgabedatei erscheint nur die 6-stellige Zahl aus dem Dateinamen. Das ist zwar nicht unbedingt falsch, besser wäre es aber, wenn kein Eintrag erfolgt und es keine Fehlermeldung gibt.

Trotz vorliegendem Powershell-Ergebnis (vielen Dank an Flachkoepper) wäre ich immer noch an einer Batch-Lösung interressiert, da das Script bzw. der Batch auch auf älteren PCs ohne Powershell 4.0 laufen soll. Gibt es da eine Lösung?
Mitglied: 126919
Solution 126919 Mar 02, 2016 updated at 18:18:56 (UTC)
Goto Top
Zitat von @Eichhorn63:
Etwas Feintuning könnte man evtl. noch vornehmen. Wenn der Suchbegriff in einer Datei nicht vorkommt, gibt es eine Fehlermeldung und in der Ausgabedatei erscheint nur die 6-stellige Zahl aus dem Dateinamen.
Kein problem ist oben angepasst ...
gci 'c:\quelle\*.log' | %{  
    $fnumber = $_.Basename -replace '^(\d+).*','$1'  
    [regex]::matches((gc $_.Fullname | out-string), '(?im)(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*?interneNummer=(\d+)') | select -Expand Captures | %{"$fnumber $($_.Groups[1].Value) $($_.Groups[2].Value)"}  
} | out-file 'c:\quelle\ergebnis.txt'  
da das Script bzw. der Batch auch auf älteren PCs ohne Powershell 4.0 laufen soll.
By the way funktioniert das hier auch mit der PS 2.0 problemlos, gerade nochmal getestet.

Und das ganze kannst du ebenfalls komplett in eine Batch packen wenn du willst.
@echo off
powershell -ExecutionPolicy Bypass -Version 2 -Command "gci 'c:\quelle\*.log' | %%{$fnumber = $_.Basename -replace '^(\d+).*','$1';[regex]::matches((gc $_.Fullname | out-string), '(?im)^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}).*?interneNummer=(\d+)') | select -Expand Captures | %%{\"$fnumber $($_.Groups[1].Value) $($_.Groups[2].Value)\"}} | out-file 'c:\quelle\ergebnis.txt'"  
Mitglied: 126919
Solution 126919 Mar 02, 2016 updated at 18:19:06 (UTC)
Goto Top
Zitat von @Eichhorn63:
Trotz vorliegendem Powershell-Ergebnis (vielen Dank an Flachkoepper) wäre ich immer noch an einer Batch-Lösung interressiert,
Auch kein Problem wenn's unbedingt sein muss face-wink...

@echo off & setlocal enabledelayedexpansion
set "quelle=C:\quelle"  
set "ziel=C:\quelle\result.txt"  
for %%a in ("%quelle%\*.log") DO @(  
	set "fname=%%~nxa"  
	set "number=!fname:~0,6!"  
	for /f "tokens=1,3 delims=.=," %%b in ('findstr /ic:"interneNummer" "%%a" 2^>nul') do @(  
		>>"%ziel%" echo !number! %%b %%c  
	)
)
Member: Eichhorn63
Eichhorn63 Mar 02, 2016 at 18:17:39 (UTC)
Goto Top
Hut ab vor so viel Kompetenz. Hat bestens funktioniert. Nochmals vielen Dank.