Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: lalaman

lalaman (Level 1) - Jetzt verbinden

21.08.2008, aktualisiert 23.08.2008, 7732 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


mfg
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 ..
Ähnliche Inhalte
Batch & Shell

Übergabe einer Zeile die vor der per findstr gefundenen Zeile liegt

gelöst Frage von 2nd.level.noobieBatch & Shell9 Kommentare

Aaaalso erstmal ein freundliches Hallo und wie gehts. Ich nutze euer Forum seit ein paar Tagen für Recherchen bezüglich ...

Windows Tools

Findstr und regex

gelöst Frage von tobmesWindows Tools5 Kommentare

Hi Experten, ich habe ziemlich viele PDF-Dateien, die ich mittels eines Batch-Files nach einem Bestimmten Muster durchsuchen möchte. Die ...

Batch & Shell

Hilfe bei findstr reg expression

gelöst Frage von TheUntouchableBatch & Shell5 Kommentare

Hallo liebe Admins, ich bräuchte Hilfe beim erstellen einer reg expression mit findstr: Aus folgender Textdatei sollen nur die ...

Batch & Shell

Nur findstr Erstfund ausgeben

gelöst Frage von neusterBatch & Shell18 Kommentare

Bin komplett neu hier und kenne mich überhaupt nicht aus. Kann man mit dem Befehl findstr auch nur den ...

Neue Wissensbeiträge
Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 4 StundenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 14 StundenSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Microsoft
Folder Security Viewer-Lizenzen zu gewinnen
Information von kgborn vor 15 StundenMicrosoft

Ich nehme das Thema mal in Absprache mit Frank hier auf, da es für den einen oder anderen Administrator ...

Hardware

Feueralarm killt Festplatten in Rechenzentrum - führt zu größerem Ausfall

Information von kgborn vor 15 StundenHardware11 Kommentare

Noch ein kleiner Beitrag für Administratoren, die in Rechenzentren aktiv sind - so als Fingerzeig. Denn es gibt Szenarien, ...

Heiß diskutierte Inhalte
Linux
Linux Server oder Windows Server - lohnt eine Umstellung auf Linux und ebenso basierende SW bei einer langfristigen Planung?
Frage von motus5Linux23 Kommentare

Wir brauchen bei uns einen neuen Server. Dieser wird als Fileserver, Domäne Controller sowie Exchange Server verwendet. Wir versuchen ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL18 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...

LAN, WAN, Wireless
Kommunikation zwischen verschiedenen IP-Bereichen
Frage von DirkHoLAN, WAN, Wireless13 Kommentare

Hallo zusammen, von Unitymedia habe ich ein neues Modem (Connect Box) erhalten, das u.a. IPv4 aber keinen Bridge Mode ...

Windows Server
Domänencontroller trennen
Frage von Akit57Windows Server13 Kommentare

Hallo, ich hoffe das mir hier jemand meine Frage trotz der spärlichen Informationen die ich geben kann beantworten kann: ...