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:
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]
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]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 297813
Url: https://administrator.de/forum/batch-soll-informationen-aus-logfiles-auslesen-297813.html
Ausgedruckt am: 06.04.2025 um 06:04 Uhr
8 Kommentare
Neuester Kommentar

Mit Powershell ein Klacks
Gruß fk
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

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 Zunächst gab es den Fehler
Out-File : Der Zugriff auf den Pfad "C:\ergebnis.txt" wurde verweigert.
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 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?
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!

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 ...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.
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'"

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 Trotz vorliegendem Powershell-Ergebnis (vielen Dank an Flachkoepper) wäre ich immer noch an einer Batch-Lösung interressiert,
@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
)
)