77575
Goto Top

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

Content-Key: 149862

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

Printed on: April 26, 2024 at 13:04 o'clock

Member: bastla
bastla Aug 27, 2010 at 14:27:48 (UTC)
Goto Top
Hallo 01-01-01!
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 ... face-wink

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
Beim Aufruf ist der Datenbankname und die Zeilenanzahl zu übergeben, also etwa:
C:\Batches\GetDBInfo.cmd "<datenbank-02>" 3
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
Mitglied: 77575
77575 Aug 28, 2010 at 17:30:23 (UTC)
Goto Top
hallo bastla,

vielen dank, das hat im großen und ganzen wunderbar geklappt.

hab die zeile 10 noch geändert
for /f "delims=:" %%i in ('findstr /n /c:"Datenbankname: %DB%" "%Ein%"') do set "Skip= %%i" & set /a Skip-=1

und zeile 13 weggelassen.

musste auch noche ne weiter variable definieren weil der text "Datenbankname: " leider auch nicht immer gleich ist.


vielen dank nochmal

gruss 01