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

Frage Entwicklung Batch & Shell

GELÖST

Mit findstr eine Zeile zurück

Mitglied: lalaman

lalaman (Level 1) - Jetzt verbinden

21.08.2008, aktualisiert 23.08.2008, 7669 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
Findstr stolpert über das UND Zeichen
Frage von RaidManBatch & Shell13 Kommentare

hallo und guten Abend, habe mir eine Batch datei gebaut zum umsortieren und korrigieren von Textdateien, das funktioniert auch ...

Neue Wissensbeiträge
Router & Routing

PfSense als Addon auf QNAP

Information von magicteddy vor 5 StundenRouter & Routing2 Kommentare

Moin, für Spielereien eine ganz nette Idee aber ich fürchte das soetwas auch als echte Firewall genutzt wird: In ...

Datenschutz

Teamviewer kommt für IoT-Geräte wie den Raspberry Pi

Information von magicteddy vor 12 StundenDatenschutz

Moin, jetzt werden IoT Geräte endgültig zur Wanze? Anscheinend kann man auf einem Dashboard seine Geräte visualisieren Ich stelle ...

Microsoft

Letzte Updates für Win10 und Server2016 müssen bei Bedarf über den Update catalogue in den WSUS importiert werden!

Tipp von DerWoWusste vor 17 StundenMicrosoft1 Kommentar

automatisch kommt da nichts an im WSUS und auch nicht im SCCM. Siehe Hinweise zum Bezug der jeweils neuesten ...

Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 3 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Heiß diskutierte Inhalte
Netzwerkmanagement
Preis für Wartungsvertrag ok?
gelöst Frage von a-za-zNetzwerkmanagement22 Kommentare

Hallo! Mal ne Frage, weil ich mich mit dem akzeptablen Preis für einen Reaktionszeitvertrag nicht auskenne. Meine Firma hat ...

Windows Netzwerk
Ist ein Portforwarding auf einen PC ohne lauschendes Programm ein (großes) Sicherheitsproblem?
Frage von PluwimWindows Netzwerk13 Kommentare

Hallo zusammen, zur Fernwartung eines Rechners an einem anderen Ort nutze ich VNC. Da dieser Rechner einfach nur eine ...

Windows Server
Terminal Server 2016 erkennt Berechtigungen nicht
gelöst Frage von Thomas2Windows Server10 Kommentare

Hallo Administratoren, folgendes Problem stellt sich dar: Es gibt zwei Windows Server 2016, die als Terminal Server fungieren. Jetzt ...

Sonstige Systeme
7-zip: Programm frägt nach Passwort erst bei einzelnen Dateien
Frage von freeskierchrisSonstige Systeme7 Kommentare

Guten Morgen, ich habe ein Problem beim Arbeiten mit 7-zip: Wenn ich die einzelnen Dateien zu einem Archiv verpacke ...