Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Auslesen von 2 Werten aus einer Textdatei (in abhängigkeit vo suchkriterien)

Frage Entwicklung Batch & Shell

Mitglied: pumi32

pumi32 (Level 1) - Jetzt verbinden

09.07.2008, aktualisiert 18.10.2012, 5289 Aufrufe, 9 Kommentare

Guten Abend, ich habe schon öfter hier Hilfe gefunden, da Google häufiger bei meinen Wünschen in sachen Batch administrator.de angibt.
Nun habe ich schon einige Zeit gesucht aber nicht das richtige gefunden bzw mir ist es selber nicht eingefallen, bzw nur so kompliziert, das es einfach quatsch ist diesen Ansatz weiterzuverfolgen.
Zum Probem:

Ich habe eine Textdatei und möchte dort Zeiten auslesen
die datei sieht etwa so aus:
[12:23:56] prüfen von infos
[12:23:57] infos ok
[12:23:59] start event
[13:14:38] komisches eingabemodul
[13:18:14] stop event
[13:19:01] prüfen von infos
[13:23:59] start event
[14:14:38] Fehler!!!
[14:19:11] prüfen von infos
[14:20:38] start event
[15:38:10] stop event

Ich möchte ich die Zeit zwischen start und stop herausbekommen -> das Ziel


nur kann ich z.b. mit diesem befehl die starts und mit dem 2. die stops ausgeben lassen:

01.
for /f "delims=" %%a in ('find "Start event" datei.txt') do echo %%a 
02.
for /f "delims=" %%a in ('find "stop event" datei.txt') do echo %%a
Hierbei werden erst die start zeilen ausgegeben und anschließend die stop
Nur ich brauche ja die abhängigkeiten davon,
da habe ich gedacht, das ich nach event suche und dann später nach start suche, aber dies macht der befehl find bzw findstr nicht mit

desweiteren brauche ich auch noch eine abfrage, das das start das nächste am stop ist, ansonsten habe ich ja eine falsche Zeit

Und mir fällt einfach keine lösung ein, die sinnvoll wäre
bzw nur sehr aufwändig
(alle suchen lassen und in eine txt datei schreiben, auslesen alle zeiten umwandeln dann vergleichen mit den stop zeiten, und die nächsten nehmen)
da dachte ich mir das das eig auch in einer schleife zu schaffen sein müsste.
Nur an dieser stelle verlassen mich meine batch-kentnisse

Falls es da eine einfache Lösung bzw einen lösungsansatz gibt würde ich mich freuen und gerne weiterprobieren bis ich mein Ziel erreicht habe

Mit freundlichen Grüßen
pumi32
Mitglied: Biber
09.07.2008 um 22:15 Uhr
Moin pumi32,

ich würde das von CmD-Prompt aus so abfackeln:
01.
>for /f "tokens=1,2" %a in ('findstr /i "Start Stop" test.log') do @if "%b"=="start" (set "%b=%a") else @echo Start/Stop !start! %a 
02.
Start/Stop [12:23:59] [13:18:14] 
03.
Start/Stop [14:20:38] [15:38:10]
-oder im Batch-
01.
@echo off & setlocal enableDelayedExpansion 
02.
for /f "tokens=1,2" %%a in ('findstr /i "Start Stop" test.log') do ( 
03.
        if "%%b"=="start" ( 
04.
          set "%%b=%%a"  
05.
          ) else ( 
06.
        echo Start/Stop !start! %%a 
07.
))
Grüße
Biber
Bitte warten ..
Mitglied: pumi32
09.07.2008 um 23:21 Uhr
danke für die idee, ich muß erstmal die ganzen funktionen durchgehen und auf meine bedürfnisse dann umstellen
und es ist echt schnell, sowas wundert mich wirklich (bei emailanfragen warte ich generell immer 1-2 tage ;)
super support!
danke Biber

melde mich vll erst morgen

edit:
das script nimmt jeden start und stop befehl, und das ist ein problem, da es öfter vorkommt, das start vorkommt
also müsste man es eingrenzen:
01.
findstr /C:"start event" /C:"stop event" 
würde soetwas funktionieren?


ps: deine batch alleine geht bei mir nicht (WinXP pro SP2)
ergebnis:
Start/Stop !start! [13:18:14]
Start/Stop !start! [15:38:10]
bei ändern von !start! in %start% kommen beisesmal [14:20:38] als start

OK jetzt geht sie^

edit2:
so wieder da

Und leider ist es so das ich wirklich nach "start event" suchen muß, da es öfer vorkommt das event und auch start vorkommt

ich werde erstmal testen und dann gucken was ich so hinbekomme, dann kann ich vll genauer fragen

So:
das script geht jetzt per batch (komandozeile is weniger wichtig ;)
Bitte warten ..
Mitglied: Biber
10.07.2008 um 08:01 Uhr
Moin pumi32,

wenn "start" öfters vorkommt, dann wäre doch ein Filter nach " event" vielleicht sinnvoller, oder bringt das auch unerwünschte Dubletten?
01.
findstr  /i "event" test.log 
02.
-oder ggf- 
03.
findstr  /i /C:"] st" test.log|findstr "event"
deine batch alleine geht bei mir nicht
Bei mir ist als Default unterm CMD-Prompt eingestellt "EnableDelayedExpansion". Ab Werk aber nicht.
Bedeutet, dass Du an Deinem CMD-Prompt noch ein "setlocal enableDelayedExpansion & " vor diese quick & dirty-Zeile oben setzen müsstest.
In dem Batchschnipsel war noch ein Prozentzeichen zuwenig (tTppfehler). habe ich oben ergänzt.
Bitte nochmal damit testen.

In der Batchversion ist es ja explizit drin, und die Zeile vom CMD-Prompt aus sollte ja nur ein proof-of-concept (neudeutsch für hingeschlampertes Antesten) sein.

Grüße
Biber
Bitte warten ..
Mitglied: pumi32
11.07.2008, aktualisiert 18.10.2012
Ich habe jetzt ein wenig getestet und meine "zu durchsuchende Datei" nochmal genau angeguckt und da ist mir aufgefallen, das es mit der suchmatrix "..." geht
Und diese: findstr /C:"] S" test.log^|findstr "event"

Allerdings frage ich mich ob man auch nach mehr suchen kann, also z.b. nach
"starte event"
-> gleichzeitig aber auch nach
"stop event"
->dies als kompletten Wert, wie ich das mit:
findstr /C:"start event" /C:"stop event"
zeigen wollte
das er also nach "start event" sucht und nich nach start und event


zum verständnis der variabeln (aus dem Mit Batch Datei 2 bestimmte Zeilen aus .ini verändern - thread):
WoW Biber, wenn man das so ließt weiß ich wie wenig ich eig über Batch weiß:
darum meine Frage:
was ist der unterschied zwischen diesen variabeln:
var=wert
und diesen:
"var=wert"
?

desweiteren habe ich auch noch vor
CD \pfad\nocheinpfad
in meinem batch einzusetzen, weil sich dort die dateien für mein batch befinden
da aus dem gleichen thread dies auch schlecht zu sein scheint (von der programierung und auch beim schreiben von logs denk ich mal)
würde ich sagen das man den gleichen befehl dann so schreiben müsste?:
PushD cd /d F:\_download, upload\
und bei ausführung von
popd ist man wieder bei der aktuellen

Frage:
warum soll cd /d ... schlecht sein?
Bitte warten ..
Mitglied: Biber
11.07.2008 um 18:50 Uhr
Moin pumi32,

nun mal nicht so viele Fragen auf einmal - ich bin doch kein Lexikon...

Also, wenn Du unbedingt die weniger dokumentierten CMD-Bereiche ein bisschen erwandern willst... Du hast es so gewollt.

Dieses Konstrukt
findstr /C:"start event" /C:"stop event"
...das geht so nicht. Aber wie folgt geht es stressarm:
Ich habe Deine Test.log mal um zwei "ähnliche" Zeilen erweitert:
01.
>type test.log 
02.
[12:23:56] prüfen von infos 
03.
[12:23:57] infos ok 
04.
[12:23:59] start event 
05.
[13:14:38] komisches eingabemodul 
06.
[13:18:14] stop event 
07.
[13:19:01] prüfen von infos 
08.
[13:23:59] start event 
09.
[14:14:38] Fehler!!! 
10.
[14:19:11] prüfen von infos 
11.
[14:20:38] start event 
12.
[15:38:10] stop event 
13.
[15:38:19] other event 
14.
[16:20:18] start noch irgendeinen event
Ziel: Die soll durchflöht werden nach "start event" und "stop event"-Einträgen.
Und nur "genau" die Zeilen mit "start event"/"stop event" finden, nicht die ähnlichen.

Nun denn, am CMD-Prompt (einzugebende Zeilen beginnen mit ">"):
01.
>echo start event>such.lst 
02.
>echo stop event>>such.lst 
03.
>findstr /G:such.lst test.log 
04.
[12:23:59] start event 
05.
[13:18:14] stop event 
06.
[13:23:59] start event 
07.
[14:20:38] start event 
08.
[15:38:10] stop event
...as should do....
Nachkaspern, verstehen, abgewandelt in den Batch einbauen.
was ist der unterschied zwischen diesen variabeln:
var=wert
und diesen:
"var=wert"
Kommt darauf an. Die erste Variante ist die offiziell dokumentierte.
Funktioniert auch meistens.
Aber: Falls unbeabsichtigt ein Leerzeichen hinter "wert" steht oder deren 3...
Dann ist der Inhalt von %Var% unbeabsichtigterweise "wert " statt "wert".
Bei Vergleichen ist das ärgerlich.
Wenn also in %meinUsername% der Inhalt "Biber " (mit trailing blank) steht..
IF /i "%meinUsername%"=="Biber" goto :ok
Den Fehler kannst Du durch die Schreibweise [Set "Var=wert"] vermeiden.
PushD cd /d F:\_download, upload\
und bei ausführung von
popd ist man wieder bei der aktuellen
Ja, fast. Nochmal die Syntax-Hilfe von PushD lesen.

Frage:
warum soll cd /d ... schlecht sein?
Weil Du ja nicht nur auf den "neuen" Pfad inkl. Laufwerk wechseln willst.
Sondern nach Deiner Verarbeitung auch wieder dahin, wo alles begann.
Und woher kennst Du den Pfad, wo Du begonnen hast???
PushD "merkt" sich den intern...und mit einem PopD geht wieder zurück.

Das macht die Sache schon einfacher.

Grüße
Biber
Bitte warten ..
Mitglied: pumi32
12.07.2008 um 13:13 Uhr
So habe jetzt mal ein wenig weitergearbeitet und diese batch habe ich nun:
Ein paar fehler sind noch bei der ausführung aufgetaucht (ich vermute, es liegt an irgentwelchen rechenoperationen):
Ein auszug der ausgeführten batch:
01.
Downloadzeit: 1 h 42 Min 8 Sec 
02.
Geschwindigkeit von 01:18:44 bis 2:60:52 betrõgt: 16,71 kiB/s 
03.
 
04.
starte 03:09:41 
05.
Start: 03:09:41 
06.
stope: 04:59:59 
07.
Stop : 04:59:59 
08.
Ungültige Zahl. Nummerische Konstanten sind entweder dezimale (17), 
09.
hexadezimale (0x11) oder oktale (021) Zahlen. 
10.
Downloadzeit: 1 h 42 Min 18 Sec 
11.
Geschwindigkeit von 03:09:41 bis 04:59:59 betrõgt: 16,68 kiB/s 
12.
 
13.
starte 05:00:48 
14.
Start: 05:00:48 
15.
stope: 06:50:53 
16.
Stop : 06:50:53 
17.
Downloadzeit: 1 h 50 Min 5 Sec 
18.
Geschwindigkeit von 05:00:48 bis 06:50:53 betrõgt: 15,50 kiB/s
Hier die ÜBERAREITETE Batch (leider noch nicht alle Fehler weg)
01.
@echo off & setlocal enableDelayedExpansion 
02.
Title RSD Log Auswertung 
03.
PUSHD F:\_download, upload\RSD\ 
04.
set log=F:\log.log 
05.
:: POPD zum zurückspringen 
06.
Echo Auswertung des Logs... 
07.
for %%h in (*.txt) do ( 
08.
Echo. >>!log! 
09.
Echo %%h: >>!log! 
10.
Echo. >>!log! 
11.
Echo. >>!log! 
12.
for /f "tokens=1,2" %%a in ('findstr /C:"] S" "%%h"^|findstr "Download"') do ( 
13.
        if "%%b"=="Starte" ( 
14.
          set "%%b=%%a" 
15.
		  ) else ( 
16.
set /a h=!Starte:~1,2! 
17.
set /a m=!Starte:~4,2! 
18.
set /a s=!Starte:~7,2! 
19.
		  set Stop=%%a 
20.
set /a h2=!Stop:~1,2! 
21.
set /a m2=!Stop:~4,2! 
22.
set /a s2=!Stop:~7,2! 
23.
	echo starte !Starte:~1,8! >>!log! 
24.
	echo Start: !h!:!m!:!s! >>!log! 
25.
	echo stope: !Stop:~1,8! >>!log! 
26.
	echo Stop : !h2!:!m2!:!s2! >>!log! 
27.
 
28.
if !h2! LSS !h! (set /a h2=h2+24) 
29.
if !s2! LSS !s! (set /a m2=m2-1 & set /a s2=s2+60) 
30.
if !m2! LSS !m! (set /a h2=h2-1 & set /a m2=m2+60) 
31.
set /a h3=!h2!-!h! 
32.
set /a m3=!m2!-!m! 
33.
set /a s3=!s2!-!s! 
34.
 
35.
if !h3!==0 ( 
36.
set Dauer=!m3! Min !%s3! Sec 
37.
if !m3!==0 (set Dauer=!s3! Sec) 
38.
) else (if !m3!==0 (set Dauer=!h3! h !s3! Sec) else (set Dauer=!h3! h !m3! Min !s3! Sec)) 
39.
set /a sm=!m3!*60 
40.
set /a sh=!h3!*3600 
41.
set /a sges=!s3!+!sm!+!sh! 
42.
set /a dz=10240000/!sges! 
43.
set dz=!dz:~,2!,!dz:~2,3! 
44.
	Echo Downloadzeit: !Dauer! >>!log! 
45.
	Echo Geschwindigkeit von !h!:!m!:!s! bis !h2!:!m2!:!s2! beträgt: !dz! KiB/s >>!log! 
46.
	echo. >>!log! 
47.
))) 
48.
pause 
49.
:: Alternative suche: 
50.
::1 findstr /C:"..." "%%h" 
51.
::2 echo Starte Download>such.lst 
52.
::2 echo Schließe Download ab>>such.lst 
53.
::2 findstr /G:such.lst "%%h"
Bitte warten ..
Mitglied: Biber
14.07.2008 um 07:20 Uhr
Moin pumi32,

ja, der angezeigte Fehler liegt an irgendwelchen Rechenoperationen.
Und zwar werden alle Zahlenwerte, die mit "0" beginnen als Oktalzahlen interpretiert. Klappt hervorragend bei 01, 02..07.. und geht in die Grütze bei 08 und 09, die zwar als Stunden/Minuten-Angaben häufig vorkommen, aber als Oktalwerte eben gar nicht.
[Frag nicht, wer sich diesen Pfusch ausgedacht hat]

Ich kann Dir nur als Workaround anbieten:
Wenn Du mit Minuten/Stundenangaben "rechnen" willst, dann bringe die Werte auf eine drei- oder mehrstellige Zahl und ermittle danach wieder mit Modulo oder Subtraktion die ein-oder zweistelligen Werte.

Beispiel: Wenn Stundenenwert "08" kommen könnte
z.B (%starte%=08:15:00),
01.
set /a h=1%Starte:~1,2% -100 
02.
REM Varinate1 - würde "gelesen" werden als ... 
03.
REM ...Set /a h=108 -100 = 8 
04.
set /a h=10%Starte:~1,2% %% 1000 
05.
REM Variante 2 würde "gelesen" werden als ... 
06.
REM Set /a h=1008 Mod 1000 = 8
Grüße
Biber
Bitte warten ..
Mitglied: pumi32
15.07.2008 um 00:29 Uhr
danke für die aufklärung
mich hat auch gewundert, warum das nicht bei allen zahlen vorkommt

ich hatte mir solch eine lösung überlegt:
ich frage mit einer if anfrage ab ob sich an der 1. stelle eine 0 befindet und wenn ja dann nimm nur die 2. (bsp):
01.
if !Starte:~1,1!=0  (set /a h=!Starte:~2,1!) else (set /a h=!Starte:~1,2!)
aber deins scheint programcode einzusparen;)
und das find ich immer gut - also werde ich deine nehmen (meine aber mal testen und gucken ob es einen geschwindigkeitsunterschied gibt ^^

ps allerdings verstehe ich variante 2 nicht
was ist gemeit mit mod, kenn ich nicht?
(und es geht nicht in meinem cmdline version (vermutlich wegen den fehlenden @setlocal etc)
-> wie kann man das standartmäißg einstellen, bzw wichtigere frage was ist der nachteil wenn man es standartmäßig einstellt?
es wäre nett wenn du mir dies auch erklären könntest
Bitte warten ..
Mitglied: Biber
15.07.2008 um 10:19 Uhr
Moin pumi32,

der Modulo-Operator (im Batch wird er eben als "%" geschrieben) liefert den Rest einer Division.

Beipiel von oben:
1008 Modulo 1000 entspricht dem Rest von 1008 geteilt durch 1000
Ganzzahliges Ergebnis von 1008 / 1000 ist 1 (was uns nicht interessiert.
Rest von (1008 / 1000) = 8 <---- den rest wollen wir wissen.

Da nun "zufällig" der Modulo-Operator das Prozentzeichen ist, welches wiederum im Batch ohnehin spezielle bedeutung hat, muss es im Batch verdoppelt werden.
01.
--CMD-Prompt: Eingabezeilen bginnen mit ">" 
02.
>set /a zahl= 1008 
03.
1008 
04.
>set /a "zahl % 1000" 
05.
06.
>set /a zahl % 1000 
07.
8
Diese beiden Schreibweisen (mit/ohne Anführungszeichen) sind gleichwertig.

Im Batch macht es einen Unterschied - OHNE Anführungszeichen MUSS das %-Zeichen "maskiert"=verdoppelt werden.

01.
:: im batch 
02.
set /a zahl= 1008 
03.
set /a derRest="zahl % 1000" 
04.
-- oder ohne Anfü-zeichen- 
05.
set /a derRest=zahl %% 1000 
06.
@echo %derRest%
Gehen wird das auch an Deinem CMD-Prompt - Dir fehlt keine Standardeinstellung.
Eine Standard-Eröffnungszeile in Batchen ist das
01.
@echo off & setlocal
...wobei das "Setlocal" bewirkt, dasss die im Batch geSETzten Variablen bei Batch-Ende automatisch entsorgt werden und somit nicht andere Progrämmchen/Bätche verwirren können (Ausschliessen von Seiteneffekten).

Grüße
Biber
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
gelöst BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren (9)

Frage von Manuel1234 zum Thema Batch & Shell ...

Google Android
Textdatei auf SD Karte auslesen funktioniert nicht (Oneplus One) (4)

Frage von lordzwieback zum Thema Google Android ...

Batch & Shell
Per Batch Textdatei Spaltenweise auslesen nochmal weil ich dumm bin (9)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Batch & Shell
Batch Textdatei Spaltenweise auslesen (7)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (32)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...