Textdokument mit Forschleife Auswerten und ausgeben
Guten Morgen zusammen.
Mal wieder habe ich eine Aufgabe wo ich ein Textdokument parsen muss.
Das Textdokument sieht folgendermassen aus:
2013/10/25 16:00:07 [2888] connect from NBAPS185
2013/10/25 16:00:08 [2888] rsync on AdminClients/ from nbaps185
2013/10/25 16:00:08 [2672] connect from NBAPS141
2013/10/25 16:00:08 [2888] building file list
2013/10/25 16:00:08 [2672] rsync on AdminClients/ from nbaps141
2013/10/25 16:00:08 [2672] building file list
2013/10/25 16:00:08 [2888] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:00:09 [2672] sent 10919 bytes received 2720 bytes total size 21576781
2013/10/25 16:00:11 [3476] connect from
2013/10/25 16:00:11 [3476] rsync on adminservicevmnew/ from
2013/10/25 16:00:11 [3476] building file list
2013/10/25 16:00:13 [3852] connect from NBAPS49
2013/10/25 16:00:13 [3852] rsync on AdminClients/ from nbaps49
2013/10/25 16:00:13 [3476] sent 7143 bytes received 74 bytes total size 414994843
2013/10/25 16:00:13 [3852] building file list
2013/10/25 16:00:15 [3852] sent 10922 bytes received 2723 bytes total size 21576781
2013/10/25 16:04:13 [3768] connect from NBAPS85
2013/10/25 16:04:13 [3768] rsync on AdminClients/ from nbaps85
2013/10/25 16:04:14 [3768] building file list
2013/10/25 16:04:14 [3768] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:07:31 [3120] connect from UNKNOWN
2013/10/25 16:07:31 [3120] rsync on AdminClients/ from unknown
2013/10/25 16:07:31 [3120] building file list
2013/10/25 16:07:32 [3120] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:08:00 [3948] connect from UNKNOWN
2013/10/25 16:08:02 [3948] rsync on AdminClients/ from unknown
2013/10/25 16:08:02 [3948] building file list
2013/10/25 16:08:04 [3948] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:08:38 [3772] connect from
2013/10/25 16:08:38 [3772] rsync on adminservicevmnew/ from
Ich soll nun aus diesem Dokument Die Zeile wo sich NBAPS befindet ausgeben undzwar mit folgendem Format:
Rechner NBAPS gemeldet am %Datum%
Ich habe mich etwas reingelesen und mein Ansatz ist folgender:
FOR /F "tokens=1,3,4* delims= " %f IN (text.log) DO (findstr /I /S /C:"connect") echo %a %b %c
allerdings erhalte ich den fehler: Echo was unexpected this time
Was mach ich falsch?
Vielen Dank schon mal für eine Hilfe
Mal wieder habe ich eine Aufgabe wo ich ein Textdokument parsen muss.
Das Textdokument sieht folgendermassen aus:
2013/10/25 16:00:07 [2888] connect from NBAPS185
2013/10/25 16:00:08 [2888] rsync on AdminClients/ from nbaps185
2013/10/25 16:00:08 [2672] connect from NBAPS141
2013/10/25 16:00:08 [2888] building file list
2013/10/25 16:00:08 [2672] rsync on AdminClients/ from nbaps141
2013/10/25 16:00:08 [2672] building file list
2013/10/25 16:00:08 [2888] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:00:09 [2672] sent 10919 bytes received 2720 bytes total size 21576781
2013/10/25 16:00:11 [3476] connect from
2013/10/25 16:00:11 [3476] rsync on adminservicevmnew/ from
2013/10/25 16:00:11 [3476] building file list
2013/10/25 16:00:13 [3852] connect from NBAPS49
2013/10/25 16:00:13 [3852] rsync on AdminClients/ from nbaps49
2013/10/25 16:00:13 [3476] sent 7143 bytes received 74 bytes total size 414994843
2013/10/25 16:00:13 [3852] building file list
2013/10/25 16:00:15 [3852] sent 10922 bytes received 2723 bytes total size 21576781
2013/10/25 16:04:13 [3768] connect from NBAPS85
2013/10/25 16:04:13 [3768] rsync on AdminClients/ from nbaps85
2013/10/25 16:04:14 [3768] building file list
2013/10/25 16:04:14 [3768] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:07:31 [3120] connect from UNKNOWN
2013/10/25 16:07:31 [3120] rsync on AdminClients/ from unknown
2013/10/25 16:07:31 [3120] building file list
2013/10/25 16:07:32 [3120] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:08:00 [3948] connect from UNKNOWN
2013/10/25 16:08:02 [3948] rsync on AdminClients/ from unknown
2013/10/25 16:08:02 [3948] building file list
2013/10/25 16:08:04 [3948] sent 9853 bytes received 2540 bytes total size 21576781
2013/10/25 16:08:38 [3772] connect from
2013/10/25 16:08:38 [3772] rsync on adminservicevmnew/ from
Ich soll nun aus diesem Dokument Die Zeile wo sich NBAPS befindet ausgeben undzwar mit folgendem Format:
Rechner NBAPS gemeldet am %Datum%
Ich habe mich etwas reingelesen und mein Ansatz ist folgender:
FOR /F "tokens=1,3,4* delims= " %f IN (text.log) DO (findstr /I /S /C:"connect") echo %a %b %c
allerdings erhalte ich den fehler: Echo was unexpected this time
Was mach ich falsch?
Vielen Dank schon mal für eine Hilfe
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 222903
Url: https://administrator.de/contentid/222903
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
11 Kommentare
Neuester Kommentar
Hallo @Dpole86,
das scheint mir nicht ganz richtig, da ist ein Denkfehler drin.
Erkläre uns doch bitte kurz, wie du dir die Abarbeitung in der Schleife gedacht hast.
Gruß,
@Snowman25
das scheint mir nicht ganz richtig, da ist ein Denkfehler drin.
Erkläre uns doch bitte kurz, wie du dir die Abarbeitung in der Schleife gedacht hast.
Gruß,
@Snowman25
Hi @Dpole86,
mach's so:
Gruß, @Snowman25
€dith:
Dann doch eher so:
Den Teil ab der ID kannst du dann mit rekonstruieren.
Vergiss nicht, dass in einem Batchfile alle Schleifenvariablen doppelte %-Zeichen brauchen!
mach's so:
FOR /F "tokens=1,2,3,6 delims= " %a IN ('type text.log^|findstr NBAPS') DO @ECHO Rechner %d gemeldet am %a um %b. %c
€dith:
Dann doch eher so:
FOR /F "tokens=1-6 delims= " %a IN ('type test.log^|findstr NBAPS') DO @ECHO Rechner %f gemeldet am %a um %b. %c
Echo %d %e %f
Vergiss nicht, dass in einem Batchfile alle Schleifenvariablen doppelte %-Zeichen brauchen!
Das Caret (^) ist zur Maskierung der Pipe (|). Würde dieses nicht maskiert werden, würde der Befehlszeileninterpreter (die
Mit dem Caret wird es richtig geparst:
Das at-Zeichen (@) dient zum verstecken der Eingabezeile auf der Ausgabekonsole. Wenn du den Befehl auf der Kommandozeile ausführst, siehst du den Unterschied:
MIT @:
OHNE @:
Gruß,
@Snowman25
cmd
) versuchen, das Ergebnis von FOR /F "tokens=1,2,3,6 delims= " %%a IN ('type text.log
als Input für findstr NBAPS') DO ECHO Rechner %%d gemeldet am %%a um %%b. %%c
zu verwenden. Das zerstört allerdings die Syntax von FOR und endet dadurch ganz einfach in einem Fehler.Mit dem Caret wird es richtig geparst:
type text.log
wird als Input für den findstr NBAPS
-Befehl verwendet.Das at-Zeichen (@) dient zum verstecken der Eingabezeile auf der Ausgabekonsole. Wenn du den Befehl auf der Kommandozeile ausführst, siehst du den Unterschied:
MIT @:
C:\Users\me\Desktop>FOR /F "tokens=1-6 delims= " %a IN ('type test.log^|findstr NBAPS') DO @ECHO Rechner %f gemeldet am %a um %b. %c
Rechner NBAPS185 gemeldet am 2013/10/25 um 16:00:07. [2888]
Rechner NBAPS141 gemeldet am 2013/10/25 um 16:00:08. [2672]
Rechner NBAPS49 gemeldet am 2013/10/25 um 16:00:13. [3852]
Rechner NBAPS85 gemeldet am 2013/10/25 um 16:04:13. [3768]
OHNE @:
C:\Users\me\Desktop>FOR /F "tokens=1-6 delims= " %a IN ('type test.log^|findstr NBAPS') DO ECHO Rechner %f gemeldet am %a um %b. %c
C:\Users\me\Desktop>ECHO Rechner NBAPS185 gemeldet am 2013/10/25 um 16:00:07. [2888]
Rechner NBAPS185 gemeldet am 2013/10/25 um 16:00:07. [2888]
C:\Users\me\Desktop>ECHO Rechner NBAPS141 gemeldet am 2013/10/25 um 16:00:08. [2672]
Rechner NBAPS141 gemeldet am 2013/10/25 um 16:00:08. [2672]
C:\Users\me\Desktop>ECHO Rechner NBAPS49 gemeldet am 2013/10/25 um 16:00:13. [3852]
Rechner NBAPS49 gemeldet am 2013/10/25 um 16:00:13. [3852]
C:\Users\me\Desktop>ECHO Rechner NBAPS85 gemeldet am 2013/10/25 um 16:04:13. [3768]
Rechner NBAPS85 gemeldet am 2013/10/25 um 16:04:13. [3768]
Gruß,
@Snowman25
Zitat von @Dpole86:
Vielen Herzlichen Dank :D
gibt es die Möglichkeit das ich den output mit ";" trenne und das in eine CSV exportiere?
Vielen Herzlichen Dank :D
gibt es die Möglichkeit das ich den output mit ";" trenne und das in eine CSV exportiere?
SET logfile=text.log
SET outputfile=output.csv
SET searchstring=NBAPS
FOR /F "tokens=1-6 delims= " %a IN ('type %logfile%^|findstr %searchstring%') DO (
@ECHO Rechner %f gemeldet am %a um %b. %c
@Echo %a;%b;%c;%d;%f>>%outputfile%
)
Gibt folgenden Output in
output.csv
:2013/10/25;16:00:07;[2888];connect;NBAPS185
2013/10/25;16:00:08;[2672];connect;NBAPS141
2013/10/25;16:00:13;[3852];connect;NBAPS49
2013/10/25;16:04:13;[3768];connect;NBAPS85
Wenn das alles ist, beachte bitte Wie kann ich einen Beitrag als gelöst markieren?.
Ich bin nicht bastla, der Thread sollte schon längst gelöst sein aber hier ist deine Antwort:
Und hättest du gleich geschrieben, dass du ein rsync-Log auswerten möchtest und eine aktuelle Liste aller Clients und deren letzte Connect-Daten haben möchtest, wären wir auch schon fertig
SET logfile=text.log
SET outputfile=output.csv
SET searchstring=NBAPS
SET searchexclude=not
FOR /F "tokens=1-6 delims= " %%a IN ('type %logfile%^|findstr %searchstring%^|findstr /V %searchexclude%') DO (
@ECHO Rechner %%f gemeldet am %%a um %%b. %%c
@Echo %%a;%%b;%%c;%%d;%%f>>%outputfile%
)
Und hättest du gleich geschrieben, dass du ein rsync-Log auswerten möchtest und eine aktuelle Liste aller Clients und deren letzte Connect-Daten haben möchtest, wären wir auch schon fertig