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

BATCH - Zeile(n) aus Log-Datei in eine Archiv-Datei nur wenn nicht vorhanden einlesen

Frage Entwicklung Batch & Shell

Mitglied: BlattlausOG

BlattlausOG (Level 1) - Jetzt verbinden

15.06.2014, aktualisiert 16.06.2014, 1534 Aufrufe, 18 Kommentare

Hallo,

dieser Einzeiler fügt mir Zeile für Zeile den Inhalt von d:\log in d:\archiv.txt untereinander ein.

01.
Log-to-Archiv.bat 
02.
type "d:\log">>"d:\archiv.txt"
Was muss geändert werden, wenn in d:\archiv.txt eine Zeile nur einmal vorkommen darf?
Jede Zeile ist einmalig, da Zeitstempel am Zeilenanfang enthalten sind.

Der Aufbau einer Zeile sieht so aus:
2014.06.15 - 14:22:11 | Benutzer: Admin | Zähler: 5 | VPN: irgendeintextmitzahlen

Im Moment habe ich lediglich das Problem, dass mir z.B. die oben aufgeführte Zeile mehrfach nach d:\archiv.txt geschrieben wird.
Es soll ein Vergleich zuvor stattfinden ob diese oder jene Zeile aus d:\log in d:\archiv.txt besteht; wenn nein -> schreibe Zeile, wenn ja -> schreibe die Zeile nicht.

Besten Dank schon mal.

Gruß,
Blattlaus
Mitglied: bastla
15.06.2014 um 20:11 Uhr
Hallo BlattlausOG!

Ungetestet etwa so:
findstr /vg:"d:\archiv.txt" "d:\log">>"d:\archiv.txt"
Grüße
bastla
Bitte warten ..
Mitglied: Endoro
15.06.2014 um 20:16 Uhr
Hey,
ich würde das mit uniq machen (aus den GNUWin32-Tools)
01.
sort log.txt | uniq > archiv.txt
wenn es denn unbedingt Batch sein soll (umgetestet):
01.
for /f "delims=" %%a in (log.txt) do set "line.%%a=7" 
02.
for /f "tokens=1*delims=." %%a in ('set line.') do ( 
03.
   for /f "tokens=1*delims=="%%c in ("%%~b") do echo(%%c 
04.
)>archiv.txt
Gruss, Endoro.
Bitte warten ..
Mitglied: BlattlausOG
15.06.2014, aktualisiert um 21:54 Uhr
Hallo zusammen,

vielen Dank für die ultraschnelle Antwort.

Ich habe beide Varianten getestet:

@bastla:
Habe den Einzeiler mit in meine Batch eingetragen, bekomme jedoch eine Meldung dass die Zeichenfolge der "Archiv-Datei" nicht gelesen werden konnte.

@Endoro:
Habe deine zweite Variante getestet, diese scheint mir in der zweiten Zeile abzubrechen:
01.
for /f "tokens=1*delims=." %%a in ('set line.') do (
Kurze Frage...
%%a %%b %%c sind nur Variabeln, die könnte man auch in z.B. %%x %%y %%z umbenennen, oder?

Noch eine Idee?

Besten dank

Gruß,
Blattlaus
Bitte warten ..
Mitglied: Endoro
LÖSUNG 16.06.2014, aktualisiert um 13:45 Uhr
Versuch es mal so:
01.
for /f "usebackqdelims=" %%a in ("log.txt") do set ".%%a=7" 
02.
(for /f "tokens=1*delims==." %%a in ('set .') do echo(%%a 
03.
)>archiv.txt
Es funktioniert allerdings nicht für Zeilen mit = im Text.

Die Lösung von bastla könnte so funktionieren:
01.
>"d:\archiv.txt" break 
02.
findstr /vg:"d:\archiv.txt" "d:\log">>"d:\archiv.txt"
Das scheint nicht mit allen Windows-Versionen zu funktionieren, zB nicht mit XP.

Gruss, Endoro.
Bitte warten ..
Mitglied: bastla
LÖSUNG 16.06.2014, aktualisiert um 13:45 Uhr
Hallo BlattlausOG!

Sollte dann so gehen:
01.
move "d:\archiv.txt" "d:\archiv.bak" 
02.
findstr /vg:"d:\archiv.bak" "d:\log">"d:\archiv.txt"
Die bak-Datei kannst Du als Sicherungskopie betrachten oder auch gleich wieder löschen.

Grüße
bastla
Bitte warten ..
Mitglied: BlattlausOG
16.06.2014 um 13:44 Uhr
Hallo Endoro,
Hallo Bastla,

vielen Dank für Eure Unterstützung.

@Endoro:
Ich habe deinen Code getestet aber zuvor in der letzten Zeile > nach >> geändert. Ich will das vorhandene nicht überschreiben.
01.
for /f "usebackqdelims=" %%a in ("log.txt") do set ".%%a=7" 
02.
(for /f "tokens=1*delims==." %%a in ('set .') do echo(%%a 
03.
)>>archiv.txt
Leider schreibt er mir nur:
2014.
...mehrfach untereinander.

Nicht so schlimm, habe ja noch den Vorschlag von Bastla

@bastla:
Deinen habe ich ebenfalls getestet, das funktioniert soweit. Allerdings gefällt es mir nicht richtig, dass eine separate Datei angelegt wird, da sich der Batch-Vorgang all 2 Minuten wiederholt.
In der letzten Zeile wird die Datei d:\archiv.bak gelöscht.
01.
move "d:\archiv.txt" "d:\archiv.bak" 
02.
findstr /vg:"d:\archiv.bak" "d:\log">"d:\archiv.txt" 
03.
del "d:\archiv.bak"
So, dann danke ich euch beiden nochmals für die tatkräftige Unterstützung...ihr werdet wieder von mir hören

Schöne Grüße,
Blattlaus
Bitte warten ..
Mitglied: BlattlausOG
17.06.2014, aktualisiert um 14:01 Uhr
Hallo,

ich muss mich noch einmal melden bzgl. meines Anliegens.
Es scheint doch noch nicht so zu funktionieren, wie ich es gerne hätte.

Mein Vorhaben:
Es soll der Inhalt der D:\log nach D:\archiv.txt kopiert werden, wobei der Inhalt der D:\log immer bestehen bleibt.
Kommen neue Zeilen der D:\log hinzu, sollen "nur" diese nach D:\archiv.txt kopiert und angereiht werden (Vergleich).
Nach jeder Skriptausführung soll zuguterletzt der Inhalt der D:\archiv.txt alphabetisch sortiert werden.

Beispielzeile der D:\log:
2014.06.15 14:22:11 | Benutzer: blabla | Zähler: blabla | Pfad: /blabla/blabla/blabla

Mein derzeitiger Code, wo im Moment nichts passiert (hatte es mal geschafft dass er die Zeilen mehrfach einliest):
01.
copy "D:\log" "D:\log.bak" 
02.
copy "D:\archiv.txt" "D:\archiv.bak" 
03.
findstr /vg:"D:\log.bak" "D:\archiv.bak">"D:\archiv.txt" 
04.
sort "\archiv.bak" /O "D:\archiv.txt" 
05.
del "D:\log.bak" 
06.
del "D:\archiv.bak"
Würde mir nochmals jemand unter die Arme greifen?

Vieeelen Dank.
Bitte warten ..
Mitglied: bastla
17.06.2014 um 17:31 Uhr
Hallo BlattlausOG!
wo im Moment nichts passiert
trifft es nicht ganz - es wird ja eine neue "archiv.txt" mit den den zusätzlichen Zeilen erzeugt, aber dann in Zeile 4 wieder durch die alte Version ("archiv.bak") überschrieben - daher (ungetestet) eher:
01.
copy "D:\archiv.txt" "D:\archiv.neu" 
02.
findstr /vg:"D:\log" "D:\archiv.txt">>"D:\archiv.neu" 
03.
sort "D:\archiv.neu" /O "D:\archiv.txt" 
04.
del "D:\archiv.neu"
Grüße
bastla
Bitte warten ..
Mitglied: BlattlausOG
17.06.2014, aktualisiert um 23:34 Uhr
Hallo Bastla,

danke für deine Antwort.

Ich habe es eben getestet und dasselbe Phänomen wie zuvor.
In archiv.txt wird nichts geschrieben, sie bleibt leer obwohl 13 Zeilen in log enthalten sind. Man sieht, dass an/in der archiv.txt was passiert, das Änderungsdatum der Datei ändert sich jedes Mal.

Nochmal der Ablauf:
Batch wird ausgeführt -> Vergleich ob in log eine Zeile existiert die nicht in archiv.txt enthalten ist -> Zeile in Archiv.txt nicht enthalten, kopiere diese / Zeile in Archiv.txt enthalten , nichts tun -> archiv.txt alphabetisch sortieren -> log erhält von einem externen Programm neue Zeilen (ebenso unterschiedlich allein durch enthaltener Zeitstempel) dazu -> Batch wird ausgeführt -> usw. usw.

In den Zeilen sind ebenso folgende Zeichen enthalten, ich hoffe diese stören nicht die findstr-Funktion:
| ( ) _ - @ . : /

Gäbe es noch ne Alternative?

Gruß,
Blattlaus




EDIT:

Ich habe nun rumgespielt und es läuft...naja, zumindest im jetzigen Augenblick. Mal sehen wie es in ein paar Tage ausschaut.

Code:
01.
copy "D:\archiv.txt" "D:\archiv.neu" 
02.
for /f "delims=" %%a in (D:\log) do findstr /i /X /C:"%%a" D:\archiv.txt || echo %%a>>D:\archiv.neu 
03.
sort "D:\archiv.neu" /O "D:archiv.txt" 
04.
del "D:\archiv.neu"
Danke und bis zum nächsten mal

Gruß,
Blattlaus
Bitte warten ..
Mitglied: Endoro
18.06.2014, aktualisiert um 03:46 Uhr
Müsste auch so gehen:
01.
@echo off &setlocal 
02.
for /f "usebackqdelims=" %%a in ("log.txt") do set ".%%a=7" 
03.
for /f "usebackqdelims=" %%a in ("archiv.txt") do set ".%%a=7" 
04.
(for /f "tokens=1*delims==." %%a in ('set .') do echo(%%a 
05.
)>"archiv.txt"
Gruss, Endoro.
Bitte warten ..
Mitglied: BlattlausOG
18.06.2014, aktualisiert um 07:25 Uhr
Guten Morgen Endoro,

habe dein Code getestet, allerdings werden die Zeilen nicht richtig geschrieben.

So sollten die Zeilen ausschauen:
2014.06.16 14:22:11 | Benutzer: blabla | Zähler: blabla | Pfad: /blabla/blabla/blabla/...
2014.06.17 14:23:24 | Benutzer: blabla | Zähler: blabla | Pfad: /blabla/blabla/blabla/...
2014.06.18 14:25:15 | Benutzer: blabla | Zähler: blabla | Pfad: /blabla/blabla/blabla/...
2014.06.19 14:45:15 | Benutzer: blabla | Zähler: blabla | Pfad: /blabla/blabla/blabla/...
2014.06.20 14:51:12 | Benutzer: blabla | Zähler: blabla | Pfad: /blabla/blabla/blabla/...

So werden Sie durch den Code geschrieben:
01.
2014 
02.
2014 
03.
2014 
04.
2014 
05.
2014
Danke und Gruß,
Blattlaus
Bitte warten ..
Mitglied: Endoro
LÖSUNG 18.06.2014, aktualisiert um 13:28 Uhr
Stimmt! Danke, besser wäre dieses:
01.
@ECHO OFF &SETLOCAL disableDelayedExpansion 
02.
for /f "usebackqdelims=" %%a in ("log.txt") do set ".%%a=7" 
03.
FOR /f "usebackqdelims=" %%a in ("archiv.txt") do set ".%%a=7" 
04.
(FOR /f "tokens=1*delims==" %%a in ('set .') do ( 
05.
	FOR /f "tokens=*delims=." %%c IN ("%%~a") DO echo(%%c 
06.
))>"archiv.txt"
Nun könnte es eventuell noch Probleme mit der Codepage geben (Darstellung der Umlaute).
Gruss, Endoro
Bitte warten ..
Mitglied: BlattlausOG
18.06.2014 um 13:28 Uhr
Hi Endoro,

hab es getestet und es scheint zu funktionieren.

Ich werde deine Zeilen die nächsten Tage anwenden und melde mich nochmal wenns noch zu weiteren Problemen kommen sollte.

Besten Dank und auf bald.

Gruß,
Blattlaus
Bitte warten ..
Mitglied: BlattlausOG
20.06.2014, aktualisiert um 17:06 Uhr
Hallo zusammen,

ich bräuchte nochmals Unterstützung, um mein Vorhaben zu optimieren. Zu Testzwecken kommt diese Anpassung zum Einsatz.

Der gewünschte Ablauf:

Im Moment wende ich folgenden Code an...
01.
@ECHO OFF &SETLOCAL disableDelayedExpansion 
02.
for /f "usebackqdelims=" %%a in ("log.txt") do set ".%%a=7" 
03.
FOR /f "usebackqdelims=" %%a in ("archiv.txt") do set ".%%a=7" 
04.
(FOR /f "tokens=1*delims==" %%a in ('set .') do ( 
05.
	FOR /f "tokens=*delims=." %%c IN ("%%~a") DO echo(%%c 
06.
))>"archiv.txt"
...dieser Code funktioniert einwandfrei, nur die Sortierung sollte wie folgt aussehen (jüngster Zeitstempel in ertse Zeile):
2014.06.17 15:22:11 | Benutzer: Achim | Zähler: 1 | Pfad: /blabla/blabla/blabla
2014.06.17 14:23:11 | Benutzer: Uwe | Zähler: 1 | Pfad: /blabla/blabla
2014.06.15 14:24:11 | Benutzer: Bert | Zähler: 1 | Pfad: /blabla/blabla/blabla
2014.06.14 14:24:11 | Benutzer: Olaf | Zähler: 1 | Pfad: /blabla
...
...ist dass dann der Fall, kann die eigendliche Anpassung stattfinden.

Batch ausführen -> Zeilen der log.txt auslesen und mit archiv.txt vergleichen -> existiert der "PFAD" in archiv.txt nicht, komplette Zeile verschieben / existiert der "PFAD" in archiv.txt, den Wert von log.txt mit dem Wert aus archiv.txt addieren und überschreiben -> Inhalt der archiv.txt sortieren -> Inhalt der log.txt und log.temp.txt (eine tempöräre Datei eines Programms) leeren.
So sollte die Ausgabe aussehen:
2014.06.17 15:22:11 | Benutzer: Achim | Zähler: 2 | Pfad: /blabla/blabla/blabla
2014.06.17 14:23:11 | Benutzer: Uwe | Zähler: 1 | Pfad: /blabla/blabla
2014.06.15 14:24:11 | Benutzer: Bert | Zähler: 2 | Pfad: /blabla/blabla/blabla
2014.06.14 14:24:11 | Benutzer: Olaf | Zähler: 1 | Pfad: /blabla
...

Hat hierfür jemand eine Lösung?

Vielen Dank wieder einmal vorab

Gruß.
Blattlaus
Bitte warten ..
Mitglied: Endoro
20.06.2014 um 20:40 Uhr
Hey,
ich verstehe deine Erklärung leider nicht.
Wohin wird was verschoben?
Was wird addiert?
Was bedeutet es, eine Datei zu "leeren"?
Gruss, Endoro
Bitte warten ..
Mitglied: BlattlausOG
20.06.2014, aktualisiert 21.06.2014
Hi Endoro,

erneuter Versuch

Benutzer:
Zähler:
Pfad:
...sind statische Namen die sich nie ändern, dahinter jedoch folgen Variablen welche verglichen werden müssen.

Funktionsweise:
1. Batch wird ausgeführt
2. Zeilen der log.txt einlesen
3. Suche nach Stichwörter in log.txt die am Scriptanfang frei definiert werden können, wenn gefunden lösche komplette Zeile in log.txt (unter Stichwörter fallen einzelne Wörter ohne Umlaute oder Sonderzeichen)
4. Existiert der aus der log.txt eingelesene Pfad: (z.B. /blabla/blabla/blabla) in archiv.txt nicht, komplette Zeile nach archiv.txt kopieren oder verschieben.
Existiert der Pfad: (z.B. /blabla/blabla/blabla) irgendwo in archiv.txt, dann den Zähler-Wert von log.txt mit dem Zähler-Wert aus archiv.txt addieren bzw. zusammenzählen (siehe "Zähler" und "Pfad" in Ausgabe weiter unten) und den Zähler-Wert in Archiv.txt mit dem Ergebnis überschreiben (alle Zähler-Werte in der Zeile wo z.B. der Pfad: /blabla/blabla/blabla vorkommt)
5. Inhalt der archiv.txt sortieren (jüngster Zeitstempel in erste Zeile)
6. Inhalt der log.txt und log.temp.txt (eine tempöräre Datei eines Programms) löschen.

So sollte die Ausgabe aussehen in archiv.txt:
2014.06.17 15:22:11 | Benutzer: Achim | Zähler: 2 | Pfad: /blabla/blabla/blabla
2014.06.17 14:23:11 | Benutzer: Uwe | Zähler: 1 | Pfad: /blabla/blabla
2014.06.15 14:24:11 | Benutzer: Bert | Zähler: 2 | Pfad: /blabla/blabla/blabla
2014.06.14 14:24:11 | Benutzer: Olaf | Zähler: 1 | Pfad: /blabla
...

Hoffe es ist etwas verständlicher und nicht zu aufwändig...

Gruß,
Blattlaus
Bitte warten ..
Mitglied: Endoro
21.06.2014 um 00:57 Uhr
Hey,
Was soll in 2. verglichen werden und was ist die Konsequenz aus dem Vergleich?
Wie können die Stichwörter in 3. aussehen (Beispiele).

(alle Zähler-Werte in der Zeile wo der Pfad: /blabla/blabla/blabla vorkommt)
Was ist damit gemeint? Die Variable Pfad ist eindeutig.

5. Wonach sortieren? Aufwärts oder abwärts?

Das wächst sich zu einem Projekt aus.
Leider muss ich zu allem, was ich an der Backe habe, auch noch in Urlaub fahren.
Wenn dich dies alles in 2 Wochen noch interessiert, erstelle einen Testdatensatz.
Gruss, Endoro
Bitte warten ..
Mitglied: BlattlausOG
21.06.2014 um 01:45 Uhr
Hallo Endoro,

Urlaub, na das hört sich doch gut an!

Leider muss ich zu allem, was ich an der Backe habe, auch noch in Urlaub fahren.
Entweder verstehe ich das falsch, oder du "musst" in Urlaub fahren...na ich würde sofort tauschen

Mach dir kein Stress, ist für mich eh nur zum testen und somit eilt es nicht.

Danke dir trotzdem für die großartige Unterstützung und wünsche schöne Urlaubstage.

Gruß,
Blattlaus
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Batch & Shell
gelöst Batch erst starten wenn bestimmte Datei vorhanden ist (7)

Frage von pdiddo zum Thema Batch & Shell ...

Batch & Shell
gelöst PowerShell, Log Datei auslesen, bei Änderungen E-Mail senden (12)

Frage von swissbull zum Thema Batch & Shell ...

Netzwerkmanagement
gelöst Sophos UTM220 - Appliance CPU Auslastung LOG-Datei downloaden? (7)

Frage von 1410640014 zum Thema Netzwerkmanagement ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

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

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...