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

per Batch neuste Datei öffnen und bestimmtes Muster auslesen

Frage Entwicklung Batch & Shell

Mitglied: Simmon

Simmon (Level 1) - Jetzt verbinden

15.01.2008, aktualisiert 17:49 Uhr, 7665 Aufrufe, 7 Kommentare

Hallo zusammen,
meine Batch-Kenntnisse reichen leider für mein aktuelles Vorhaben nicht aus, daher hoffe ich, auf diesem Wege vielleicht ne Hilfestellung zu bekommen:

- In einem Ordner befinden sich mehrere log-Dateien mit dem Namensmuster 'XYZ_ZEITSTEMPEL.log' also z.B. 'XYZ_20080115_1024.log'
- In diesen Dateien befindet sich irgendwo ein bestimmtes Textsegment, welches ich gerne in eine neu anzulegende Datei verschieben würde. Den Beginn des Segmentes kann ich eindeutig identifizieren. Das Ende ebenfalls. Dazwischen befindet sich eine bestimmte Anzahl Zeilen (variabel), welche ich gerne in die andere Datei verschieben würde.

In Pseudocode ausgedrückt bräuchte ich also folgende Funktion

1. Identifiziere die neuste (anhand 'Date modified') aller Dateien im Verzeichnis, die mit 'XYZ' beginnen
2. Suche erstes Vorkommen von Muster 'ABC' in dieser Datei
3. Suche erstes Vorkommen von Muster 'DEF' nach dem ersten Vorkommen von 'ABC'
4. Kopiere die dazwischen liegenden Zeilen in neue Datei 'Neu.txt'


- Das Muster 'DEF' kommt sehr oft in der Datei vor, daher ist es im Punkt 3 wichtig, das erste Vorkommen von 'DEF' NACH 'XYZ' zu finden
- Das Identifizieren der neusten Datei in Punkt 1 wäre sehr komfortabel für mich, falls das nicht möglich ist, wäre auch ein Schleifendurchlauf durch alle Dateien mit 'XYZ' im Ordner möglich (und dann halt irgendwie Kopieren in 'XYZ_ZEITSTEMPEL.new' oder so


Ich hoffe mal, das ist mit ner batch-Datei überhaupt möglich

Es wäre wirklich SUPER, wenn mir jemand helfen könnte. Ich hoffe, ich habe genügend Info gepostet.

Danke schon mal im Voraus,
Simmon
Mitglied: bastla
15.01.2008 um 15:17 Uhr
Hallo Simmon und willkommen im Forum!

Ganz schematisch könnte das etwa so aussehen:
01.
@echo off & setlocal 
02.
set "Ordner=D:\Temp" 
03.
set "Muster=XYZ_*.log" 
04.
set "Neu=D:\Neu.txt" 
05.
set "Von=ABC" 
06.
set "Bis=DEF" 
07.
 
08.
if exist "%Neu%" del "%Neu% 
09.
 
10.
for /f "delims=" %%i in ('dir /b /od "%Ordner%\%Muster%" 2^>nul') do set "Neueste=%Ordner%\%%~nxi" 
11.
If not defined Neueste echo Keine passende Datei in %Ordner% gefunden! & goto :eof 
12.
 
13.
for /f "delims=:" %%i in ('findstr /n "%Von%" "%Neueste%"') do if not defined ZVon set ZVon=%%i 
14.
if not defined ZVon echo %Von% in %Neueste% nicht gefunden! & goto :eof 
15.
 
16.
for /f "delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n "%Bis%" ') do if not defined ZBis set ZBis=%%i 
17.
if not defined ZBis echo %Bis% in %Neueste% nicht gefunden! & goto :eof 
18.
 
19.
for /f "tokens=1,2 delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n $') do if %%i lss %ZBis% echo.%%j>>"%Neu%"
Die "dazwischen liegenden Zeilen" habe ich so interpretiert, dass die Zeilen mit den jeweiligen Kennzeichen ("ABC" bzw "DEF") nicht in die neue Datei geschrieben werden sollen.

Grüße
bastla

[Edit] Kleinere kosmetische Korrekturen bei Fehlermeldungen vorgenommen. [/Edit]
[Edit2] Durch Verwendung von "$" im letzten "findstr" Berücksichtigung ev Leerzeilen in der Ausgabe hinzugefügt. [/Edit2]
Bitte warten ..
Mitglied: Simmon
15.01.2008 um 15:42 Uhr
SUPER ! funktioniert schon mal ! Vielen Dank !

nur noch 2 Dinge fehlen mir zum Glück:

- die ersten 2 Zeilen des kopierten Textes beginnen mit ' ;'. Dieses Muster würde ich gerne in ein Gnuplot-Kommentar ändern. Also muss in den ersten 2 Zeilen des kopierten Text aus dem '' ein '#' werden. Kannst du mir da noch schnell helfen?

- ich würde das ganze gerne mit relativen Pfadangaben machen. In deinem Quellcode hast du absolute Angaben gemacht. Die batch-Datei befindet sich immer in dem Verzeichnis, in dem auch die .log Dateien sind. Die Datei 'Neu.txt' soll auch in diesem Ordner erstellt werden. Kann ich da die Pfadangaben weglassen bzw. wie lautet der Befehl für den aktuellen Pfad?

Gruß,
Simmon
Bitte warten ..
Mitglied: bastla
15.01.2008 um 15:59 Uhr
Hallo Simmon!

Die folgende Version bezieht das Verzeichnis aus dem Pfad der Batchdatei:
01.
@echo off & setlocal 
02.
set "Ordner=%~dp0" 
03.
set "Muster=XYZ_*.log" 
04.
set "Neu=%~dp0\Neu.txt" 
05.
set "Von=ABC" 
06.
set "Bis=DEF" 
07.
 
08.
if exist "%Neu%" del "%Neu% 
09.
 
10.
for /f "delims=" %%i in ('dir /b /od "%Ordner%\%Muster%" 2^>nul') do set "Neueste=%Ordner%\%%~nxi" 
11.
If not defined Neueste echo Keine passende Datei in %Ordner% gefunden! & goto :eof 
12.
 
13.
for /f "delims=:" %%i in ('findstr /n "%Von%" "%Neueste%"') do if not defined ZVon set ZVon=%%i 
14.
if not defined ZVon echo %Von% in %Neueste% nicht gefunden! & goto :eof 
15.
set /a Gr=2 
16.
 
17.
for /f "delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n "%Bis%" ') do if not defined ZBis set ZBis=%%i 
18.
if not defined ZBis echo %Bis% in %Neueste% nicht gefunden! & goto :eof 
19.
 
20.
for /f "tokens=1,2 delims=:" %%i in ('more +%ZVon% "%Neueste%"^|findstr /n $') do if %%i lss %ZBis% set "Zeile=%%j" & call :ProcessLine %%i 
21.
goto :eof 
22.
 
23.
:ProcessLine 
24.
if %1 leq %Gr% if "%Zeile:~0,2%"=="//" set "Zeile=#%Zeile:~2%" 
25.
echo.%Zeile%>>"%Neu%"
Das Ersetzen von "//" am Zeilenanfang durch "#" habe ich auf die ersten beiden Zeilen beschränkt.

Leerzeilen im Bereich der auszugebenden Zeilen können (noch) nicht verarbeitet werden - bei Bedarf lässt sich da noch etwas machen. Da ich eigentlich auch sonst so gut wie nichts über den Inhalt der Log-Datei weiß, kann ich nicht abschätzen, ob sich durch die für das Ersetzen nötigen Änderungen Probleme mit Sonderzeichen ergeben werden.

Grüße
bastla

[Edit] Festlegung der Zeilengrenze für Ersetzungen auf "set /a Gr=2" korrigiert. [/Edit]
Bitte warten ..
Mitglied: Simmon
15.01.2008 um 16:12 Uhr
nochmal danke.

das mit den relativen Angaben klappt wunderbar. Das Ersetzen allerdings nicht. In der neuen Datei steht immer noch '//' in den ersten beiden Zeilen.

Leerzeilen spielen keine Rolle
Bitte warten ..
Mitglied: bastla
15.01.2008 um 16:16 Uhr
Hallo Simmon!

Mir ist eben schon aufgefallen, dass die Zeile
01.
set /a Gr=%Von%+2
nur
01.
set /a Gr=2
heißen sollte - ich ersetze das auch oben.

Grüße
bastla
Bitte warten ..
Mitglied: Simmon
15.01.2008 um 17:32 Uhr
Hi,

das mit dem Ersetzen funktioniert irgendwie immer noch nicht. Es hat sich aber mittlerweile ergeben, dass dies eigentlich nicht wichtig ist

Vielen dank für den super Support,
Simon
Bitte warten ..
Mitglied: bastla
15.01.2008 um 17:49 Uhr
Hallo Simmon!

das mit dem Ersetzen funktioniert irgendwie immer noch nicht.
Sollte (nach meinen mittlerweile vorgenommenen Tests) aber eigentlich an den Daten liegen (es werden jeweils die ersten beiden Zeichen der ersten beiden Ausgabezeilen überprüft und ggf ersetzt) - aber wenn Du' s ohnehin nicht mehr brauchst ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Basic
gelöst Mit Visual Basic Batch Datei öffnen (26)

Frage von Flodsche zum Thema Basic ...

Batch & Shell
gelöst BATCH ini Datei Datei auslesen (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst Ordner per Batch verschieben, Datei kopieren (2)

Frage von Shape.Shifter zum Thema Batch & Shell ...

Batch & Shell
Batch: Word Datei kopieren und umbennen (9)

Frage von ExcelNoob177 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...