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

Mit findstr eine Zeile zurück

Frage Entwicklung Batch & Shell

Mitglied: lalaman

lalaman (Level 1) - Jetzt verbinden

21.08.2008, aktualisiert 23.08.2008, 7413 Aufrufe, 13 Kommentare

Guten Abend allerseits!

Habe ein denk ich mal nicht so aufwändiges Problem...

ich möchte mit findstr eine txt durchsuchen auf ein bestimmtest Muster und wenn dieses in einer Zeile gefunden wurde, die Zeile selbst und die darüber in eine neue txt kopieren.

so in der Richtung müsste es ja aussehen...



for /F "delims=[] tokens=1" %%a in ('findstr /I "Muster" List.txt') do echo %%a >>Neue_List.txt



Bsp-Text:

asdkuhuwqajshd
asdlkjfhjlkhfa
aösdljMusteras
ösldkjfmnsadlj


...dann würde ich in der neuen txt gerne diese Zeilen haben: "aösdljMusteras" und "asdlkjfhjlkhfa"

hoffe das war einigermaßen verständlich


Mit freundlichen Grüßen
lalaman
Mitglied: filippg
21.08.2008 um 22:32 Uhr
Hallo,

ich weiß jetzt nicht, ob das für dich hilfreich ist. Aber mit der Windows Powershell (quasi der Nachfolger der DOS-Shell) ist das kein Problem.
Mit der DOS-Shell kann ich das zumindest nicht. Problem: man müsste die Datei Zeilenweise durchlaufen und sich immer die vorherige noch merken. Ich weiß nicht, wie man in DOS die Datei zeilenweise durchläuft, und findstr akzeptiert als Eingabe ja auch nur Dateien, keine Strings.

Gruß

Filipp
Bitte warten ..
Mitglied: bastla
21.08.2008 um 22:46 Uhr
Hallo lalaman und filippg!

Zur Not sollte es doch auch mit CMD zu machen sein (übrigens genau mit dem von filippg beschriebenen Algorithmus):
01.
@echo off & setlocal 
02.
set "Muster=Muster" 
03.
set "Quelle=D:\Liste.txt" 
04.
set "Ziel=D:\Neue_Liste.txt" 
05.
 
06.
if exist "%Ziel%" del "%Ziel%" 
07.
set Vorige= 
08.
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i" 
09.
goto :eof 
10.
 
11.
:ProcessLine 
12.
echo %~1|findstr /i "%Muster%">nul && ( 
13.
	if defined Vorige ( 
14.
        >>"%Ziel%" echo %Vorige% 
15.
        >>"%Ziel%" echo %~1 
16.
    ) else ( 
17.
        echo Keine Zeile vor %1 gefunden! 
18.
19.
20.
set "Vorige=%~1" 
21.
goto :eof
[Edit] Falls die im Beispiel angegebene Reihenfolge in der Zieldatei tatsächlich so gemeint sein sollte, müssten die Zeilen 14 und 15 getauscht werden. [/Edit]
Grüße
bastla
Bitte warten ..
Mitglied: lalaman
21.08.2008 um 23:21 Uhr
Hallo bastla und fillipg

die Lösung von bastla funktioniert soweit ganz gut.

Eine Kleinigkeit wäre allerdings noch: Wenn Sonderzeichen im durchsuchten Text vorhanden sind scheint es Probleme zu geben. Die Zeilen wurden nicht in die Neue_Liste.txt übernommen.

Nicht funktioniert hat es z.B. bei den Zeichen " und >

Wenn man das bei der Suche noch ignorieren lassen könnte wäre das wunderbar; ansonsten funktioniert das Script einwandfrei genau so wie ich es mir gedacht hatte.

Vielen Dank schon mal für die Mühen

Grüße
lalaman
Bitte warten ..
Mitglied: bastla
22.08.2008 um 00:11 Uhr
Hallo!
Nicht funktioniert hat es z.B. bei den Zeichen " und >
Wenn Derartiges ins Spiel kommt, greife ich eigentlich tatsächlich lieber zu einer anderen Sprache (in meinem Fall VBS) - aber einen Versuch soll's wert sein:
01.
@echo off & setlocal 
02.
set "Muster=Muster" 
03.
set "Quelle=D:\Liste.txt" 
04.
set "Ziel=D:\Neue_Liste.txt" 
05.
 
06.
if exist "%Ziel%" del "%Ziel%" 
07.
set Vorige= 
08.
for /f "usebackq delims=" %%i in ("%Quelle%") do set "Zeile=%%i" & call :ProcessLine 
09.
goto :eof 
10.
 
11.
:ProcessLine 
12.
set "Zeile=%Zeile:>=^>%" 
13.
set "Zeile=%Zeile:<=^<%" 
14.
set "Zeile=%Zeile:"=§%" 
15.
echo "%Zeile%"|findstr /i "%Muster%">nul && ( 
16.
	if defined Vorige ( 
17.
        >>"%Ziel%" echo %Vorige:§="% 
18.
        >>"%Ziel%" echo %Zeile:§="% 
19.
    ) else ( 
20.
        echo Keine passende Zeile vor %Zeile:§="% gefunden! 
21.
22.
23.
set "Vorige=%Zeile%" 
24.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: lalaman
22.08.2008 um 14:34 Uhr
Hey,

also ich hab die 2te Version jetzt nochmal ausprobiert es klappt aber leider immer noch nicht richtig.

Jetzt bleibt er beim &-Zeichen hängen.

Wie würde denn die vbs-Lösung aussehen bei der alle Sonderzeichen ignoriert werden?

Ich muss es ja nicht in Batch haben

Danke für die Mühen bis hier her

Grüße
lalaman
Bitte warten ..
Mitglied: bastla
22.08.2008 um 18:49 Uhr
Hallo lalaman!

So knapp vor dem Ziel wirst Du doch wohl nicht aufgeben wollen ...

Füge vor Zeile 14 noch ein:
01.
set "Zeile=%Zeile:&=^&%"
und wenn Dir noch mehr von diesen ekelhaften Sonderzeichen (ich denke da vor allem an "|") begegnen sollten, kannst Du mit denen nach dem gleichen Muster verfahren.
Mit VBS ist der Aufwand ausnahmsweise etwas geringer als in Batch:
01.
Quelle = "D:\Liste.txt" 
02.
Ziel = "D:\Neue_Liste.txt" 
03.
Muster = "Muster" 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
Zeilen = Split(fso.OpenTextFile(Quelle).ReadAll, vbCrLF) 
07.
Set Z = fso.CreateTextFile(Ziel, True) 
08.
For i = 0 To UBound(Zeilen) 
09.
    If InStr(1, Zeilen(i), Muster, vbTextCompare) > 0 Then 
10.
        If i > 0 Then 
11.
            Z.WriteLine Zeilen(i - 1) 
12.
            Z.WriteLine Zeilen(i) 
13.
        Else 
14.
            WScript.Echo "Suchbegriff bereits in der ersten Zeile gefunden!" 
15.
        End If 
16.
    End If 
17.
Next 
18.
Z.Close		
Grüße
bastla
Bitte warten ..
Mitglied: lalaman
23.08.2008 um 11:01 Uhr
Moin,

perfekt, die vbs-Lösung hat gleich funktioniert! Jetzt ignoriert er alle Zeichen...
Vielen Dank für die Hilfe


Grüße
lalaman
Bitte warten ..
Mitglied: lalaman
19.06.2009 um 12:56 Uhr
Hallo allerseits!

Das oben aufgeführte VBS Script funktioniert bei mir immer noch einwandfrei.

Jetzt hätte ich allerdings noch eine Ergänzungsfrage:
Ist es möglich das "Muster", das gesucht wird in Zeile 3, noch etwas anders zu definieren.

Ich hätte gerne, dass Zahlen gesucht werden; z.B. steht in dem Fließtext:

TextTextTextTextTextText
3 Männer arbeiten
TextTextTextTextTextText
15 Männer arbeiten
TextTextTextTextTextText
1382 Männer arbeiten
TextTextTextTextTextText

...ich möchte jetzt z.B. alle Zeilen mit 4 Männern haben und alle höheren Zahlen auch; also in diesem Fall die Zeilen mit 15 und 1382 Männern.

Der Rest des Scripts soll so bleiben...dass die Zeile davor mitkopiert wird usw.

Hoffe es war einigermaßen verständlich was ich möchte.
Wäre sehr nett, wenn mir nochmal jemand helfen könnte, weil ich wirklich null Ahnung von vbs habe

Viele Grüße
lalaman
Bitte warten ..
Mitglied: bastla
19.06.2009 um 15:38 Uhr
Hallo lalaman!

Wenn ich das richtig verstanden habe (und das Suchschema immer "Zeilenanfang - ganze Zahl - Leerzeichen - Suchmuster" lautet), etwa so:
01.
Quelle = "D:\Liste.txt" 
02.
Ziel = "D:\Neue_Liste.txt" 
03.
 
04.
Min = 4 
05.
Muster = "Männer" 
06.
 
07.
Set rE = New RegExp 
08.
rE.IgnoreCase = True 
09.
rE.Pattern = "^(\d+) " & Muster 
10.
 
11.
Set fso = CreateObject("Scripting.FileSystemObject") 
12.
Zeilen = Split(fso.OpenTextFile(Quelle).ReadAll, vbCrLF) 
13.
Set Z = fso.CreateTextFile(Ziel, True) 
14.
For i = 0 To UBound(Zeilen) 
15.
    If rE.Test(Zeilen(i)) Then 
16.
        Wert = rE.Execute(Zeilen(i))(0).SubMatches(0) 
17.
        If CInt(Wert) >= Min Then 
18.
            If i > 0 Then 
19.
                Z.WriteLine Zeilen(i - 1) 
20.
                Z.WriteLine Zeilen(i) 
21.
            Else 
22.
                WScript.Echo "Suchbegriff bereits in der ersten Zeile gefunden!" 
23.
            End If 
24.
        End If 
25.
    End If 
26.
Next 
27.
Z.Close
Grüße
bastla

P.S.: Die Benachrichtigungsfunktion ist auch bei als "gelöst" markierten Beiträgen aktiv.
Bitte warten ..
Mitglied: lalaman
20.06.2009 um 15:27 Uhr
Guten Morgen!

Also erstmal Danke für die erneut schnelle Hilfe! Das Script funktioniert so wie von dir beschrieben ("Zeilenanfang - ganze Zahl - Leerzeichen - Suchmuster") perfekt.
Allerdings passt das mit dem Zeilenanfang noch nicht...also das Muster Zahl - Leerzeichen - Wort befindet sich im Text und nicht immer am Zeilenanfang...lässt sich das noch irgendwie einbauen?!

Grüße
lalaman
Bitte warten ..
Mitglied: bastla
20.06.2009 um 15:52 Uhr
Hallo lalaman!

Für den Zeilenanfang "zuständig" ist das Zeichen "^" in der Zeile 9 - wenn Du dieses weglässt (die Zeile sähe dann so aus: )
rE.Pattern = "(\d+) " & Muster
wird das erste Vorkommen an beliebiger Stelle in der Zeile gesucht.

Grüße
bastla
Bitte warten ..
Mitglied: lalaman
20.06.2009 um 16:17 Uhr
Perfekt! Es funktioniert!

Ich bin mal wieder zu unendlichem Dank verpflichtet

Hätte ich nur mehr Ahnung von VB

Naja danke jedenfalls!

Grüße
lalaman
Bitte warten ..
Mitglied: Roachman
10.04.2014 um 19:31 Uhr
Guten Abend @ all,

bin nach einer suche auf diesen Thread gestoßen. Mein Ziel war aber nicht wie angegeben das Muster mit der Zeile davor in eine Datei zu exportieren, sondern diese beiden Zeilen in einem neuen Dokument zu löschen. Dank bastla konnte dies auch umgesetzt werden. Hier die Variante.
01.
@echo off & setlocal 
02.
set "Muster=Muster" 
03.
set "Quelle=D:\Liste.txt" 
04.
set "Ziel=D:\Neue_Liste.txt" 
05.
 
06.
if exist "%Ziel%" del "%Ziel%" 
07.
set "Vorige=" 
08.
for /f "usebackq delims=" %%i in ("%Quelle%") do call :ProcessLine "%%i" 
09.
if defined Vorige >>"%Ziel%" echo %Vorige% 
10.
goto :eof 
11.
 
12.
:ProcessLine 
13.
echo %~1|findstr /i "%Muster%">nul && ( 
14.
    set "Vorige=" 
15.
) || ( 
16.
    if defined Vorige >>"%Ziel%" echo %Vorige% 
17.
    set "Vorige=%~1" 
18.
19.
20.
goto :eof
Vielen Dank an bastla

Roachman
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Script zum Auflösen einer Ordnerstruktur und zurück gesucht (12)

Frage von websolutions zum Thema Batch & Shell ...

Batch & Shell
gelöst Findstr - code für schwieriger Abfrage gesucht (9)

Frage von reissaus73 zum Thema Batch & Shell ...

DNS
Nslookup gibt falschen DNS Namen zurück (3)

Frage von ultrapottoti zum Thema DNS ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...