neuster
Goto Top

Nur findstr Erstfund ausgeben

Bin komplett neu hier und kenne mich überhaupt nicht aus.

Kann man mit dem Befehl findstr auch nur den Erstfund einer definierten Zeichenfolge aus vielen txt Files ausgeben?

Gruss

Content-Key: 368572

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

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: Kraemer
Kraemer 19.03.2018 um 16:01:27 Uhr
Goto Top
Moin,

ja, beispielsweise indem du das Ergebnis nimmst und dir dort den ersten Fund heraussuchst.

Gruß
Mitglied: colinardo
colinardo 19.03.2018 aktualisiert um 16:19:57 Uhr
Goto Top
@echo off
set "found="  
for /f "delims=" %%a in ('findstr /ic:"SuchMich" "D:\Ordner\*.txt" 2^>nul') do if not defined found set "found=%%a"  
echo %found%
Grüße Uwe
Mitglied: Pedant
Pedant 19.03.2018 aktualisiert um 21:35:11 Uhr
Goto Top
Hallo neuster,

wenn Dich nur der erste Fund interessiert, könntest Du in leichter Abwandlung von colinardos Skript auch die For-Schleife beim ersten Fund verlassen und könntest Dir somit die Durchsuchung aller weiteren Zeilen und Dateien sparen.

@echo off
set "found="  
for /f "delims=" %%a in ('findstr /ic:"SuchMich" "D:\Ordner\*.txt" 2^>nul') do (  
	set "found=%%a"  
	goto gefunden
)

:gefunden
echo %found%
Falls Dich nicht der Zeileninhalt interessiert, der "SuchMich" enthält, sondern der Name der Datei in der "SuchMich" gefunden wurde, müsstest Du ein zusätzliches /m bei findstr angeben:
('findstr /m /ic:"SuchMich" "D:\Ordner\*.txt" 2^>nul')

Gruß Frank
Mitglied: colinardo
colinardo 20.03.2018 aktualisiert um 07:31:37 Uhr
Goto Top
könntest Du in leichter Abwandlung von colinardos Skript auch die For-Schleife beim ersten Fund verlassen und könntest Dir somit die Durchsuchung aller weiteren Zeilen und Dateien sparen.
Servus Frank. Das stimmt so leider nicht, die Suche wird vor dem durchlaufen ausgeführt und die Zeilen trotzdem alle durchlaufen auch wenn man meint daß die Schleife durch das goto vorher verlassen wird, durchläuft die cmd im Hintergrund trotzdem alle Zeilen des findstr Outputs (nur führt sie im Schleifen-Body dann einfach nichts mehr aus und expandiert nur noch), beide Methoden schenken sich also nichts und sind leider gleich ineffizient.
https://stackoverflow.com/questions/6728798/exiting-out-of-a-for-loop-in ...

Da sollte man dann besser gleich die Skriptsprache wechseln oder ein eigenes Tool hernehmen wenn es einem um Performance geht.

Grüße Uwe
Mitglied: neuster
neuster 20.03.2018 um 07:14:56 Uhr
Goto Top
Guten Morgen miteinander
Erst mal möchte ich mich für eure Unterstützung bedanken.

Konnte heute mal die, für mich kryptischen Zeichenfolgen ausprobieren.
Verstehen tu ich es immer noch nicht face-sad

Ich habe mal die Pfade so angepasst wie ich als nicht Sheldon Cooper mir dachte.

@echo off
set "found="
for /f "delims=" %%a in ('findstr /R /B "7.000"[0-9]"00E+1" *.txt >> C:\Users\pum\Desktop\Messungen\Zusammenfassung.txt 2^>nul') do if not defined found set "found=%%a"
echo %found%

Leider hat das nicht funktioniert. Habs auch mit dem /ic: probiert.

Was ich aber gestern schon geschafft habe war, dass ich alle Funde der 500 txt Files in ein neues File schreiben lassen konnte.

@echo off & setlocal enabledelayedexpansion
findstr /R /B "7.000"[0-9]"00E+1" *.txt >> C:\Users\pum\Desktop\Messungen\Zusammenfassung.txt

Gruss
Marc
Mitglied: colinardo
colinardo 20.03.2018 aktualisiert um 07:36:23 Uhr
Goto Top
Hallo Marc,
Das kann ja bei dir auch nicht face-smile. Erstens leitest du im Schleifenkopf um und zweitens nutzt du unescaped verschachtelte Anführungszeichen im Findstr-Pattern.
@echo off
cd /d "%~dp0"  
set "found="  
for /f "delims=" %%a in ('findstr /r "7\.000[0-9]00E\+1" *.txt 2^>nul') do if not defined found set "found=%%a"  
>"C:\Users\pum\Desktop\Messungen\Zusammenfassung.txt" echo(%found%  
Dir ist schon klar daß der Suchstring bei der Nutzung von /R also Regex Pattern interpretiert wird?! Also Sonderzeichen wie Punkt, das Plus etc. mit Backslash escaped werden müssen wen sie litteral genutzt werden sollen!
Du musst uns also schon genau sagen was und wie du suchen willst.
Mitglied: colinardo
colinardo 20.03.2018 aktualisiert um 07:33:40 Uhr
Goto Top
Zitat von @neuster:
Konnte heute mal die, für mich kryptischen Zeichenfolgen ausprobieren.
Verstehen tu ich es immer noch nicht face-sad
P.s. Lesen bildet
https://www.windowspro.de/wolfgang-sommergut/findstr-das-grep-fuer-windo ...
Mitglied: neuster
neuster 20.03.2018 um 07:38:14 Uhr
Goto Top
Hallo Uwe

Ich versteh nur Bahnhof!
Leider gabs bei der Registrierung auf diese Seite Level 0 oder -1 nicht zur Auswahl.

Ich habs mal so laufen lassen. Aber wo werden die gefundenen Daten jetzt abgelegt und was bedeutet das 2^>nul ?
Mitglied: neuster
neuster 20.03.2018 um 08:01:45 Uhr
Goto Top
https://www.windowspro.de/wolfgang-sommergut/findstr-das-grep-fuer-windo ...
da war ich auch schon.

Lese jetzt seit 3 Tagen alle möglichen Sachen.

Gibts da irgendwelche Bücher für Dummies oder sonst irgend eine Weiterbildungsmöglichkeit?
Mitglied: neuster
neuster 20.03.2018 aktualisiert um 08:18:06 Uhr
Goto Top
Ich versuchs nochmals

Ich habe 500 txt files welche automatiscch erzeugt werden und alle im selben Ordner liegen.
Diese 500 txt files sehen so aus:

Time#sec#0#0.000000E+0#0.000000E+0#1|Pressure#mTorr#0#0.000000E+0#0.000000E+0#2|Position#0-100000#0#0.000000E+0#0.000000E+0#0
View

Data:
4.000000E-3 3.219258E+2 4.000000E-3 1.500000E+3 4.000000E-3 1.500000E+3
1.800000E-2 3.219178E+2 1.800000E-2 1.500000E+3 1.800000E-2 1.500000E+3
2.100000E-2 3.219178E+2 2.100000E-2 1.500000E+3 2.100000E-2 1.500000E+3
.
.
.
6.999400E+1 3.219910E+2 6.999400E+1 1.500000E+3 6.999400E+1 1.500000E+3
6.999800E+1 3.219830E+2 6.999800E+1 1.500000E+3 6.999800E+1 1.500000E+3
7.000200E+1 3.219830E+2 7.000200E+1 1.500000E+3 7.000200E+1 1.500000E+3
7.001800E+1 3.219408E+2 7.001800E+1 1.500000E+3 7.001800E+1 1.500000E+3

Zur Weiterverarbeitung in DIAdem benötige ich aus allen 500 Files die erste komplette Zeile die mit 7.000x00E+1 beginnt in einem zusammengefassten File. Das x entspricht einer Zahl zwischen 0 und 9. Da es sich bei der ersten Spalte um die Aufzeichnung der Zeit handelt können auch zwei Zeilen mit 7.000x00E+1 beginnen. Ich benötige aber nur die erste.
Das zusammegefasste File muss die 500 Zeilen beinhalten welche aus den 500 Files kommen.

Ich hoffe ich konnte mein Problem richtig beschreiben.

Gruss
Marc
Mitglied: colinardo
Lösung colinardo 20.03.2018 aktualisiert um 08:52:56 Uhr
Goto Top
Ok dann haben wir dich hier wohl missverstanden.
@echo off &setlocal enabledelayedexpansion
cd /d "%~dp0"  
>"C:\Users\pum\Desktop\Messungen\Zusammenfassung.txt" (for %%a in (*.txt) do (  
    set "found="  
    for /f "delims=" %%b in ('findstr "^7\.000[0-9]00E\+1" "%%~a" 2^>nul') do if not defined found set "found=%%b"  
    echo(!found!
))
Gibts da irgendwelche Bücher für Dummies oder sonst irgend eine Weiterbildungsmöglichkeit?
Hier im Forum die Kategorie Batch & Shell durcharbeiten, da findest du sämtliche Batchgrundlagen bis zum Abwinken, da gibt's nichts was wir hier nicht schon behandelt hätten.
Allen voran das Tutorial zur For Schleife in dem deine Fragen beantwortet werden.

Btw. lerne lieber gleich eine modernere Skriptsprache.
Mitglied: neuster
neuster 20.03.2018 um 09:20:33 Uhr
Goto Top
Juhu Juhu

Jetzt kommt genau das heraus was ich zur Weiterverarbeitung brauche.
Für mich hast du Level >5 verdient.

Jetzt werde ich mal alle Auswertungen machen und anschliessend das ganze for /f genauer analysieren.

Danke Danke Danke

Was wäre die modernere Skriptsprache?
Mitglied: colinardo
colinardo 20.03.2018 aktualisiert um 09:35:22 Uhr
Goto Top
Was wäre die modernere Skriptsprache?
Powershell, Python, Perl, Bash, ...
Für mich hast du Level >5 verdient.
Von solchen virtuellen Bewertungen halte ich zwar eigentlich nichts aber egal. Hauptsache es ist jemandem geholfen.

Dann wünsch ich dir viel Erfolg beim Lernen. face-smile
Grüße Uwe
Mitglied: Pedant
Pedant 20.03.2018 um 13:41:27 Uhr
Goto Top
Hallo Uwe,

Zitat von @colinardo:
Das stimmt so leider nicht, die Suche wird vor dem durchlaufen ausgeführt und die Zeilen trotzdem alle durchlaufen auch wenn man meint daß die Schleife durch das goto vorher verlassen wird, durchläuft die cmd im Hintergrund trotzdem alle Zeilen des findstr Outputs (nur führt sie im Schleifen-Body dann einfach nichts mehr aus und expandiert nur noch)
Danke für den Hinweis.

Ich habe gerade mal eine Batch zählen lassen
(ähnlich wie in Deinem Link).
@echo off
set "wert="  
if exist ausgabe.txt del ausgabe.txt
for /l %%i in (1,1,100000) do (
	echo For: %%i
	echo For: %%i>>ausgabe.txt
	set wert=%%i
	REM goto fertig
)

:fertig
echo Fertig: %wert%
Ohne "REM" geht das in einer Sekunde und gibt nur "1" aus.
Mit "REM" dauert es 40 Sekunden und gibt "1" bis "100000" aus.

Zuerst habe ich daraus geschlossen, dass Deine Aussage nicht korrekt wäre,
dann habe ich es nochmal ohne "REM" aber mit "1,1,10000000" ausprobiert und es hat 90 Sekunden gedauert.
Der erste Gewindigkeitsvorteil liegt also ausschließlich in der nicht weiter ausgeführten Ausgabe begründet, aber gezählt wird dennoch bis zum Ende, bevor :fertig erreicht wird.

Rhetorisch: Wie kann man eine For-Schleife in eine Sprache implementieren, die kein Break kennt?

Gruß Frank
Mitglied: Kraemer
Kraemer 20.03.2018 um 14:12:44 Uhr
Goto Top
Zitat von @Pedant:
Rhetorisch: Wie kann man eine For-Schleife in eine Sprache implementieren, die kein Break kennt?
naja, das ist mitunter der Grund, warum die Windows-Jünger von den Unixern immer wieder belächelt wurden. Wird auch der Grund sein, warum M$ die Powershell entwickelt hat. Leider haben das noch nicht alle mitbekommen und quälen sich mit so einem Mist herum face-wink
Mitglied: colinardo
colinardo 20.03.2018 aktualisiert um 14:23:58 Uhr
Goto Top
Zitat von @Pedant:
Rhetorisch: Wie kann man eine For-Schleife in eine Sprache implementieren, die kein Break kennt?
Am besten die Ausgabe gleich zu Beginn auf eine Zeile einschränken
for /f "tokens=1* delims=:" %%a in ('findstr /n "BlaBla" "Datei.txt" ^| findstr "^1:" 2^>nul') do echo %%b  
Oder endlich mal moderner werden face-smile.

Den Berufsschullehrern sollte man mal auf die Finger klopfen das sie den Jüngern immer noch primär Batch einpflanzen wollen, dann doch lieber gleich Bash. Das ist zwar einerseits nicht schlecht wenn man es (als Backup) beherrscht, andererseits schauen die dann oft nicht mehr über den Tellerrand.
Mitglied: Pedant
Pedant 20.03.2018 um 15:34:44 Uhr
Goto Top
Hallo Uwe,

Zitat von @colinardo:
Am besten die Ausgabe gleich zu Beginn auf eine Zeile einschränken
for /f "tokens=1* delims=:" %%a in ('findstr /n "BlaBla" "Datei.txt" ^| findstr "^1:" 2^>nul') do echo %%b  
Das würde aber auch nur die Ausgabe beschränken und nicht verhindern, dass "BlaBla" in allen Zeilen von "Datei.txt" gesucht wird.
Es bleibt bei For ohne Break und das ist doof.

Gruß Frank
Mitglied: colinardo
colinardo 20.03.2018 aktualisiert um 15:51:59 Uhr
Goto Top
Zitat von @Pedant:
Das würde aber auch nur die Ausgabe beschränken und nicht verhindern, dass "BlaBla" in allen Zeilen von "Datei.txt" gesucht wird.
Naja suchen muss findstr ja auf jeden Fall erst mal im ganzen File, das zweite verhindert dann das mehr Zeilen (nur eine) an den Schleifenkörper gelangen und Findstr ist da einiges schneller als der for loop selbst.
Es bleibt bei For ohne Break und das ist doof.
Alternativen gibt's ja Gott sei Dank genug, also lasst die Leichen im Keller face-smile.

Case closed
Grüße Uwe

An den TO: Bitte noch als gelöst markieren. Merci.