
77575
27.08.2010
Bestimmte Zeilen in Textdatei finden und in andere Datei schreiben
Ich bin zu blöd die Lösung allein zu finden.
Hab ein Logfile in dem ich bestimmte Angaben in eine andere Dateischreiben möchte.
Das Logfile sieht etwa so aus:
Datenbankname: <datenbank-01>
Datenbankstatus: ist OK
Config: Standard
Blah Blah: irgendwas
Blub Blub: sonstiges
Irgendwelcher Text
Irgendwelcher Text
Datenbankname: <datenbank-02>
Datenbankstatus: läuft grad nicht
Config: extra
Blah Blah: irgendwas
Blub Blub: sonstiges
Datenbankname: <datenbank-03>
Datenbankstatus: wird gestartet
Config: Standard
Blah Blah: irgendwas
Blub Blub: sonstiges
Irgendwelcher Text
Irgendwelcher Text
...usw.
Ich muss jetzt jeweils die beiden Zeilen Datenbankname: und Datenbankstatus: in eine andere Datei schreiben.
wobei ich aber nur die beiden zeilen von bestimmten Datenbanken brauche.
mit
findstr /I /C:"Datenbankname: <datenbank-02>" "meinlog.log" >>neuedatei.log
kann ich zwar die entsprechende DB Zeile herausfiltern aber nicht die dazugehörige Datenbankstatus: Zeile.
Es kann auch sein das ich bei bestimmten DB auch noch die 3 Zeile benötige.
Am liebsten wäre mir das ganze ohne FOR schleife, einfach findstr und dann angeben ob 2 zeilen oder 3 zeilen danach mit in die neue Datei geschrieben werden sollen.
Das ist zwar nicht elegant aber für mich als Nicht Batchspezi leichter zu lesen und später auch noch zu verstehen.
gruss 01
Hab ein Logfile in dem ich bestimmte Angaben in eine andere Dateischreiben möchte.
Das Logfile sieht etwa so aus:
Datenbankname: <datenbank-01>
Datenbankstatus: ist OK
Config: Standard
Blah Blah: irgendwas
Blub Blub: sonstiges
Irgendwelcher Text
Irgendwelcher Text
Datenbankname: <datenbank-02>
Datenbankstatus: läuft grad nicht
Config: extra
Blah Blah: irgendwas
Blub Blub: sonstiges
Datenbankname: <datenbank-03>
Datenbankstatus: wird gestartet
Config: Standard
Blah Blah: irgendwas
Blub Blub: sonstiges
Irgendwelcher Text
Irgendwelcher Text
...usw.
Ich muss jetzt jeweils die beiden Zeilen Datenbankname: und Datenbankstatus: in eine andere Datei schreiben.
wobei ich aber nur die beiden zeilen von bestimmten Datenbanken brauche.
mit
findstr /I /C:"Datenbankname: <datenbank-02>" "meinlog.log" >>neuedatei.log
kann ich zwar die entsprechende DB Zeile herausfiltern aber nicht die dazugehörige Datenbankstatus: Zeile.
Es kann auch sein das ich bei bestimmten DB auch noch die 3 Zeile benötige.
Am liebsten wäre mir das ganze ohne FOR schleife, einfach findstr und dann angeben ob 2 zeilen oder 3 zeilen danach mit in die neue Datei geschrieben werden sollen.
Das ist zwar nicht elegant aber für mich als Nicht Batchspezi leichter zu lesen und später auch noch zu verstehen.
gruss 01
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 149862
Url: https://administrator.de/forum/bestimmte-zeilen-in-textdatei-finden-und-in-andere-datei-schreiben-149862.html
Ausgedruckt am: 28.04.2025 um 06:04 Uhr
2 Kommentare
Neuester Kommentar
Hallo 01-01-01!

Wenn es ein Batch sein soll (und Du keine speziellen Kontakte zu MS und daher auch nur die "
Beim Aufruf ist der Datenbankname und die Zeilenanzahl zu übergeben, also etwa:
In dieser Version des Batches sind Ein- und Ausgabedatei "hardcoded", können aber bei Bedarf natürlich auch als Parameter 3 und 4 übergeben werden ...
Zum Ablauf:
Ab Zeile 9 wird die Nummer (%Skip%) der Zeile gesucht, an der die Info zur angegebenen DB beginnt. Da diese Zeile auch mit ausgegeben werden soll, wird diese Zeilennummer um 1 reduziert, um damit die Anzahl der vorher zu überspringenden Zeilen zu ermitteln.
In der zweiten Schleife werden dann nach Überspringen der entsprechenden Zeilenanzahl alle weiteren Zeilen der Eingabedatei durchlaufen, jeweils in die Variable %Zeile% gespeichert und so zur Verarbeitung an das Unterprogramm ":ProcessLine" weitergereicht.
In diesem Unterprogramm wird zunächst geprüft, ob überhaupt noch eine Zeile auszugeben ist - wenn nein, sofortiger Rücksprung ins Hauptprogramm.
Sind noch Ausgabezeilen übrig, muss deren Anzahl um 1 reduziert werden und, da ich Deine Vorgabe des DB-Namens mit den enthaltenen Sonderzeichen "<" und ">" ernst genommen habe, die Zeile für eine Ausgabe ohne umschließende Anführungszeichen durch "Maskieren" dieser Sonderzeichen "verträglich" gemacht werden - falls es in den Ausgabezeilen keine derartigen Sonderzeichen geben kann, können die Zeilen 20 und 21 ersatzlos gestrichen werden.
Schließlich kann die Zeile der Zieldatei hinzugefügt werden. Noch als Anmerkung: Die Zieldatei wird immer nur erweitert (also nicht vorweg gelöscht), sodass der Batch mehrmals hintereinander (zB aus einem weiteren Batch) aufgerufen werden kann.
Grüße
bastla
Am liebsten wäre mir das ganze ohne FOR schleife, einfach findstr und dann angeben ob 2 zeilen oder 3 zeilen danach mit in die neue Datei geschrieben werden sollen.
Die gute Nachricht vorweg: Es geht sogar ohne "findstr
" - allerdings wirst Du dafür zB einen Praktikanten brauchen ... Wenn es ein Batch sein soll (und Du keine speziellen Kontakte zu MS und daher auch nur die "
findstr
"-Version wie wir alle zur Verfügung hast), kommst Du um eine "for
"-Schleife nicht herum - und dann ist's eigentlich auch schon egal, wenn es noch eine zweite gibt:@echo off & setlocal
set "DB=%~1"
set "Anz=%~2"
if not defined Anz echo Bitte Datenbank und Zeilenanzahl als Parameter angeben! & goto :eof
set "Ein=D:\meinelog.log"
set "Aus=D:\neuedatei.log"
set Skip=
for /f "delims=:" %%i in ('findstr /n /c:"Datenbankname: %DB%" "%Ein%"') do set "Skip=%%i"
if not defined Skip echo "%DB%" nicht gefunden! & goto :eof
set /a Ab-=1
for /f "delims=" %%i in ('more +%Skip% "%Ein%"') do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
if not %Anz% gtr 0 goto :eof
set /a Anz-=1
set "Zeile=%Zeile:<=^<%"
set "Zeile=%Zeile:>=^>%"
>>"%Aus%" echo %Zeile%
goto :eof
C:\Batches\GetDBInfo.cmd "<datenbank-02>" 3
Zum Ablauf:
Ab Zeile 9 wird die Nummer (%Skip%) der Zeile gesucht, an der die Info zur angegebenen DB beginnt. Da diese Zeile auch mit ausgegeben werden soll, wird diese Zeilennummer um 1 reduziert, um damit die Anzahl der vorher zu überspringenden Zeilen zu ermitteln.
In der zweiten Schleife werden dann nach Überspringen der entsprechenden Zeilenanzahl alle weiteren Zeilen der Eingabedatei durchlaufen, jeweils in die Variable %Zeile% gespeichert und so zur Verarbeitung an das Unterprogramm ":ProcessLine" weitergereicht.
In diesem Unterprogramm wird zunächst geprüft, ob überhaupt noch eine Zeile auszugeben ist - wenn nein, sofortiger Rücksprung ins Hauptprogramm.
Sind noch Ausgabezeilen übrig, muss deren Anzahl um 1 reduziert werden und, da ich Deine Vorgabe des DB-Namens mit den enthaltenen Sonderzeichen "<" und ">" ernst genommen habe, die Zeile für eine Ausgabe ohne umschließende Anführungszeichen durch "Maskieren" dieser Sonderzeichen "verträglich" gemacht werden - falls es in den Ausgabezeilen keine derartigen Sonderzeichen geben kann, können die Zeilen 20 und 21 ersatzlos gestrichen werden.
Schließlich kann die Zeile der Zieldatei hinzugefügt werden. Noch als Anmerkung: Die Zieldatei wird immer nur erweitert (also nicht vorweg gelöscht), sodass der Batch mehrmals hintereinander (zB aus einem weiteren Batch) aufgerufen werden kann.
Grüße
bastla