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

Bestimmte Zeilen in Textdatei finden und in andere Datei schreiben

Frage Entwicklung Batch & Shell

Mitglied: 77575

77575 (Level 1)

27.08.2010 um 15:29 Uhr, 7561 Aufrufe, 2 Kommentare

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
Mitglied: bastla
27.08.2010 um 16:27 Uhr
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 ...

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:
01.
@echo off & setlocal 
02.
set "DB=%~1" 
03.
set "Anz=%~2" 
04.
if not defined Anz echo Bitte Datenbank und Zeilenanzahl als Parameter angeben! & goto :eof 
05.
 
06.
set "Ein=D:\meinelog.log" 
07.
set "Aus=D:\neuedatei.log" 
08.
 
09.
set Skip= 
10.
for /f "delims=:" %%i in ('findstr /n /c:"Datenbankname: %DB%" "%Ein%"') do set "Skip=%%i" 
11.
if not defined Skip echo "%DB%" nicht gefunden! & goto :eof 
12.
 
13.
set /a Ab-=1 
14.
for /f "delims=" %%i in ('more +%Skip% "%Ein%"') do set "Zeile=%%i" & call :ProcessLine 
15.
goto :eof 
16.
 
17.
:ProcessLine 
18.
if not %Anz% gtr 0 goto :eof 
19.
set /a Anz-=1 
20.
set "Zeile=%Zeile:<=^<%" 
21.
set "Zeile=%Zeile:>=^>%" 
22.
>>"%Aus%" echo %Zeile% 
23.
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
Bitte warten ..
Mitglied: 77575
28.08.2010 um 19:30 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst 2 große TXT Dateien vergleichen und Unterschiede in andere Datei schreiben (6)

Frage von sid.pdm zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch-Skript: Messdaten in Textdatei finden und in eine neue Datei schreiben (5)

Frage von habmalnefrage zum Thema Batch & Shell ...

VB for Applications
Bestimmte Daten aus eine CSV-Datei in eine Excel-Tabelle importieren (2)

Frage von MariaElena zum Thema VB for Applications ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...