dpole86
Goto Top

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 face-smile

Content-ID: 222903

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

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

Snowman25
Snowman25 25.11.2013 um 11:34:14 Uhr
Goto Top
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
Dpole86
Dpole86 25.11.2013 um 11:52:57 Uhr
Goto Top
Hi Snowman face-smile


Vielen Dank für die Schnelle Antwort.

Also

mit dem Tokens=1,4* sage ich das er mir das Datum (2013/10/25) speichert. in Token 4* soll er alles andere ab "connect" speichern, was er in der Schleife "IN (text.log) DO (findstr /I /S /C:"connect")" durchsucht und mir den Token 1,4* als %%a %%b ausgibt.
Mit Delims= " sag ich der schleife das für jedes leerzeichen ein neues Token erstellt wird?

Ist ein bischen wirr geschrieben tut mir leid nur kann ich es nicht anders erklären.

Ich will am Ende das Datum und die Zeile ab "connect" in variablen haben.

Grüße und Danke

Roman
Snowman25
Snowman25 25.11.2013 aktualisiert um 13:04:28 Uhr
Goto Top
Hi @Dpole86,

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  
Gruß, @Snowman25

€dith:
Zitat von @Dpole86:

Ich will am Ende das Datum und die Zeile ab "connect" in variablen haben.
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  
Den Teil ab der ID kannst du dann mit
Echo %d %e %f
rekonstruieren.

Vergiss nicht, dass in einem Batchfile alle Schleifenvariablen doppelte %-Zeichen brauchen!
Dpole86
Dpole86 25.11.2013 um 13:10:07 Uhr
Goto Top
Perfekt Danke :D


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

Kurz zumVerständnis.. was macht ^ ? und wozu ist das @ Echo ?

GrüßeRoman
Snowman25
Snowman25 25.11.2013 aktualisiert um 13:20:35 Uhr
Goto Top
Zitat von @Dpole86:

Kurz zumVerständnis.. was macht ^ ? und wozu ist das @ Echo ?
Das Caret (^) ist zur Maskierung der Pipe (|). Würde dieses nicht maskiert werden, würde der Befehlszeileninterpreter (die 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
Dpole86
Dpole86 25.11.2013 um 13:22:58 Uhr
Goto Top
Vielen Herzlichen Dank :D

gibt es die Möglichkeit das ich den output mit ";" trenne und das in eine CSV exportiere?

also so, dass das ";" als trennzeichen für die spalten wirkt?

Grüße Roman
Snowman25
Snowman25 25.11.2013 aktualisiert um 13:32:50 Uhr
Goto Top
Zitat von @Dpole86:

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?.
Dpole86
Dpole86 25.11.2013 um 13:48:49 Uhr
Goto Top
Dankeschön face-smile

habs aber auch selber hinbekommen da wir englisches Office haben

FOR /F "tokens=1,2,3,6 delims= " %%a IN ('type C:\win\bat\rsyncd.log^|findstr NBAPS') DO @echo "Rechner %%d","gemeldet am %%a","%%b">> C:\win\bat\test.csv


Grüße Roman
Dpole86
Dpole86 26.11.2013 um 14:01:39 Uhr
Goto Top
Hi Bastla

wie kann ich solche Zeilen "ignorieren" ?

2013/09/05 12:47:59 [4612] forward name lookup for NBAPS166 failed: hostname nor servname provided, or not known

Weil er gibt mir immer dieses "not" in dm CSV aus. (warum auch immer)

reicht es wenn ich in die Forschleife noch ein |findstr /v not mache?

Grüße Roman
Snowman25
Snowman25 26.11.2013 aktualisiert um 14:08:50 Uhr
Goto Top
Ich bin nicht bastla, der Thread sollte schon längst gelöst sein aber hier ist deine Antwort:
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 face-smile
Dpole86
Dpole86 26.11.2013 um 14:16:26 Uhr
Goto Top
Sorry Snowman face-sad
Ich lese hier nur grad dauernd von bastla paar threats und da habe ich nimmer dran gedacht face-sad

Danke für den Code und sorry für den langen Prozess. Ich mag halt einen step by step anleitung weil ich dann dadurch mehr lerne.

Trotzdem Danke dir face-smile

Und ja Threat ist gelöst ...jetzt :D