Top-Themen

Aktuelle Themen (A bis Z)

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 unbekannte Inhalte an variablen Stellen aus Textdatei auslesen und in neue Textdatei einfügen

Mitglied: PeterCoffee

PeterCoffee (Level 1) - Jetzt verbinden

27.07.2011 um 09:20 Uhr, 3858 Aufrufe, 3 Kommentare

Servus zusammen,

habe schon verschidenes mit "for" und "findstr" versucht, doch die Ergebnisse waren leider nicht brauchbar.
Vielleicht weiß jemand von euch eine Lösung?

In einer Logdatei sind ausschließlich fehlerhafte Anmeldeversuche von Benutzern enthalten.
Die Logdatei ist leider extrem unübersichtlich und groß.
Alles was ich herausfiltern möchte, ist das DATUM und der BENUTZERNAME, der versucht wurde.

Hier mal eine vereinfachte Variante des Szenarios:

Inhalt von Logdatei.txt:

irgendeineZeile unbekanntesWort
irgendeineZeile Datum: DATUM1
irgendeineZeile unbekanntesWort
irgendeineSerLangeZeile unbekanntesWort unbekanntesWort unbekanntesWort Benutzername: unbekannterBENUTZERNAME1 unbekanntesWort unbekanntesWort
irgendeineZeile unbekanntesWort
irgendeineZeile Datum: DATUM2
irgendeineZeile unbekanntesWort
irgendeineSerLangeZeile unbekanntesWort unbekanntesWort unbekanntesWort Benutzername: unbekannterBENUTZERNAME2 unbekanntesWort unbekanntesWort
irgendeineZeile unbekanntesWort
irgendeineZeile Datum: DATUM3
irgendeineZeile unbekanntesWort
irgendeineSerLangeZeile unbekanntesWort unbekanntesWort unbekanntesWort Benutzername: unbekannterBENUTZERNAME3 unbekanntesWort unbekanntesWort
irgendeineZeile unbekanntesWort
irgendeineZeile Datum: DATUM4
irgendeineZeile unbekanntesWort
irgendeineSerLangeZeile unbekanntesWort unbekanntesWort unbekanntesWort Benutzername: unbekannterBENUTZERNAME4 unbekanntesWort unbekanntesWort
irgendeineZeile unbekanntesWort
irgendeineZeile Datum: DATUM5
irgendeineZeile unbekanntesWort
irgendeineSerLangeZeile unbekanntesWort unbekanntesWort unbekanntesWort Benutzername: unbekannterBENUTZERNAME5 unbekanntesWort unbekanntesWort

usw

Ziel Inhalt von Ergebnisdatei.txt soll sein:

DATUM1 unbekannterBENUTZERNAME1
DATUM2 unbekannterBENUTZERNAME2
DATUM3 unbekannterBENUTZERNAME3
DATUM4 unbekannterBENUTZERNAME4
DATUM5 unbekannterBENUTZERNAME5

Bin für jede Anregung dankbar.
Mitglied: bastla
27.07.2011 um 10:31 Uhr
Hallo PeterCoffee und willkommen im Forum!

Obwohl ich nicht davon ausgehe, dass es innerhalb der jeweiligen Zeilen keine gleichbleibende Struktur gäbe (und daher zB der Benutzername als 6. Wort in der Zeile steht), ein Ansatz, der jeweils das Wort nach dem ersten "Datum:" (in genau dieser Schreibweise inkl Beachtung der Groß-/Kleinschreibung) einer Zeile als Datum und das Wort nach dem ersten "Benutzername:" als Benutzernamen interpretiert, wobei das jeweils letzte vor dem Benutzernamen gefundene Datum diesem zugeordnet wird. Als Trennzeichen zwischen den Wörtern habe ich Deinem Beispiel entsprechend das Leerzeichen interpretiert:
01.
@echo off & setlocal 
02.
set "Ein=D:\Logdatei.txt" 
03.
set "Aus=D:\Ergebnisdatei.txt" 
04.
 
05.
del "%Aus%" 2>nul 
06.
for /f "delims=" %%i in ('findstr "Datum: Benutzername:" "%Ein%"') do call :ProcessLine "%%i" 
07.
goto :eof 
08.
 
09.
:ProcessLine 
10.
set "Gefunden=" & set "Wert=" 
11.
for %%a in (%~1) do ( 
12.
    if not defined Gefunden ( 
13.
        if "%%a"=="Datum:" set "Gefunden=Datum" 
14.
        if "%%a"=="Benutzername:" set "Gefunden=Benutzername" 
15.
    ) else ( 
16.
        if not defined Wert set "Wert=%%a" 
17.
18.
19.
if defined Wert set "%Gefunden%=%Wert%" 
20.
if defined Benutzername ( 
21.
    >>"%Aus%" echo %Datum% %Benutzername% 
22.
    set "Datum=" & set "Benutzername=" 
23.
24.
goto :eof
Grüße
bastla
Bitte warten ..
Mitglied: PeterCoffee
27.07.2011 um 11:07 Uhr
Ohne mit der Wimper zu zucken, aus dem linken Ärmel geschüttelt, mit der rechten Hand gähnend an der Mauer gestanden.
Ein Held ist (schon längst) geboren. Und das soll keine Anspielung auf Dein Alter sein!

VIELEN Dank bastla !!

In der Tat hätte ich es Dir noch einfacher machen können. Ich habe es inzwischen geschafft. das Quell-Log in einem etwas übersichtlichrem Format aus dem Server zu quetschen. Aber ohne jede Herausforderung...

Meine bisherige Lösung hatte bis jetzt den Effekt, dass DATUM und BENUTZERNAME entweder untereinander standen oder aber immer wieder in einer endlosen Zeile hintereinander.

Ich würde gerne verstehen, was Deine Zeilen genau machen. Könntest Du diese noch kommentieren?

Gruß
Peter
Bitte warten ..
Mitglied: bastla
27.07.2011 um 11:31 Uhr
Hallo PeterCoffee!

Auf speziellen Wunsch :
01.
@echo off & setlocal 
02.
set "Ein=D:\Logdatei.txt" 
03.
set "Aus=D:\Ergebnisdatei.txt" 
04.
 
05.
del "%Aus%" 2>nul 
06.
REM Alle Zeilen mit den gesuchten Begriffen "Datum:" und "Benutzername:" ausfiltern und jeweils 
07.
REM an das Verarbeitungsunterprogramm als Parameter übergeben 
08.
for /f "delims=" %%i in ('findstr "Datum: Benutzername:" "%Ein%"') do call :ProcessLine "%%i" 
09.
 
10.
REM Ende Hauptprogramm (damit Unterprogramm nicht nochmals durchlaufen wird) 
11.
goto :eof 
12.
 
13.
:ProcessLine 
14.
REM Schalter rücksetzen = (Inhalte der) Variablen löschen 
15.
set "Gefunden=" & set "Wert=" 
16.
 
17.
REM Schleife über alle "Worte" der Zeile (=Parameter %1); 
18.
REM mit %~1 werden die umgebenden Anführungezeichen entfernt, 
19.
REM sodass anhand der Leerzeichen zerlegt werden kann 
20.
for %%a in (%~1) do ( 
21.
 
22.
    REM Wurde in dieser Zeile noch kein Suchbegriff gefunden? 
23.
    if not defined Gefunden ( 
24.
 
25.
        REM Wenn aktuelles Wort ein Suchbegriff ist, 
26.
        REM Art des Begriffes in der Variablen %Gefunden% speichern; 
27.
        if "%%a"=="Datum:" set "Gefunden=Datum" 
28.
        if "%%a"=="Benutzername:" set "Gefunden=Benutzername" 
29.
 
30.
        REM ansonsten dieses Wort ignorieren 
31.
 
32.
    ) else ( 
33.
 
34.
        REM Es wurde ein Suchbegriff gefunden, daher jetzt den 
35.
        REM zugehörigen Wert speichern; dies aber nur für das 
36.
        REM nächste Wort (und nicht für alle weiteren der Zeile) - 
37.
        REM deshalb die Abfrage, ob der Wert bereits vorhanden ist 
38.
        if not defined Wert set "Wert=%%a" 
39.
40.
41.
REM Wenn ein ein Wert gefunden wurde, kann er der passenden 
42.
REM Variablen (Name lt %Gefunden%) zugewiesen werden 
43.
if defined Wert set "%Gefunden%=%Wert%" 
44.
 
45.
REM Wenn ein Benutzername gefunden wurde 
46.
REM (ganz exakt wäre es, auch das Vorhandensein 
47.
REM (des Datums zu kontrollieren), 
48.
if defined Benutzername ( 
49.
 
50.
    REM Ausgabe durchführen und 
51.
    >>"%Aus%" echo %Datum% %Benutzername% 
52.
 
53.
    REM Werte des Datensatzes wieder löschen 
54.
    set "Datum=" & set "Benutzername=" 
55.
56.
REM Rücksprung ins Hauptprogramm 
57.
goto :eof
Bei weiteren Fragen: fragen

Nicht ganz leicht lesbar, aber ein weiterer Weg, den Ablauf nachzuvollziehen: Die Logdatei auf die ersten 5 Zeilen des Beispiels oben verkürzen, aus dem "echo off" ein "echo on" machen und den Batch aus einer geöffneten CMD-Shell aufrufen - für die Logzeile 2 ergäbe das dann zB
01.
D:\TEMP>call :ProcessLine "irgendeineZeile Datum: DATUM1" 
02.
 
03.
D:\TEMP>set "Gefunden="   & set "Wert=" 
04.
 
05.
D:\TEMP>for %a in (irgendeineZeile Datum: DATUM1) do (if not defined Gefunden ( 
06.
if "%a" == "Datum:" set "Gefunden=Datum" 
07.
 if "%a" == "Benutzername:" set "Gefunden=Benutzername" 
08.
)  else (if not defined Wert set "Wert=%a" ) ) 
09.
 
10.
D:\TEMP>(if not defined Gefunden ( 
11.
if "irgendeineZeile" == "Datum:" set "Gefunden=Datum" 
12.
 if "irgendeineZeile" == "Benutzername:" set "Gefunden=Benutzername" 
13.
)  else (if not defined Wert set "Wert=irgendeineZeile" ) ) 
14.
 
15.
D:\TEMP>(if not defined Gefunden ( 
16.
if "Datum:" == "Datum:" set "Gefunden=Datum" 
17.
 if "Datum:" == "Benutzername:" set "Gefunden=Benutzername" 
18.
)  else (if not defined Wert set "Wert=Datum:" ) ) 
19.
 
20.
D:\TEMP>(if not defined Gefunden ( 
21.
if "DATUM1" == "Datum:" set "Gefunden=Datum" 
22.
 if "DATUM1" == "Benutzername:" set "Gefunden=Benutzername" 
23.
)  else (if not defined Wert set "Wert=DATUM1" ) ) 
24.
 
25.
D:\TEMP>if defined Wert set "Datum=DATUM1" 
26.
 
27.
D:\TEMP>if defined Benutzername ( 
28.
echo DATUM1  1>>"Ergebnisdatei.txt" 
29.
 set "Datum="   & set "Benutzername=" 
30.
31.
 
32.
D:\TEMP>goto :eof
Die Inhalte von %%a sind hier in den Zeilen 13, 18 und 23 nachvollziehbar und in Zeile 25 (%Gefunden% hat inzwischen einen Wert, ist also nicht mehr "not defined", sodass der "else"-Zweig ausgeführt wird) erfolgt dann die Zuweisung an die Variable %Datum% (Erfolg siehe Zeile 28) ...

Grüße
bastla

P.S.: Mit meinem (fortgeschrittenen) Alter komme ich gut zurecht ...
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

BATCH Dateinamen auslesen und an variabler Stelle x Zeichen auschneiden und am Ende wieder einfügen

gelöst Frage von Marco78Batch & Shell6 Kommentare

Ich habe folgendes Problem. Ich möchte Dateinamen um einen bestimmten Teil ändern damit ich diese sortieren kann. Ist Zustand ...

Batch & Shell

BATCH: Daten aus Textdatei auslesen und in neue Textdatei separieren

gelöst Frage von Manuel1234Batch & Shell9 Kommentare

Hallo zusammen! Ich bin neu hier und freue mich auf die Gesellschaft. In meiner Frage geht es um eine ...

Batch & Shell

Batch Textdatei Spaltenweise auslesen

Frage von PinkFLuffyUnicornBatch & Shell7 Kommentare

hi, ist es irgendwie möglich anstatt eine Textdatei via Batch Spaltenweise auszulesen und nicht zeilenweise wie das normal ganz ...

Batch & Shell

Batch: Textdatei Zeilenweise auslesen

gelöst Frage von CreatorXBatch & Shell2 Kommentare

Hallo, ich weiß, zu dem Thema gibt es schon unzählige Threads. Ich hab auch einiges dazu gefunden und trotzdem ...

Neue Wissensbeiträge
Windows Server

SBS 2011: Installation von KB4457144 schlägt beim Reboot fehl - Von Dienst gesperrte Schriftart ursächlich

Tipp von the-buccaneer vor 1 StundeWindows Server

Moinsen zusammen! Das hat mich einige graue Haare gekostet: Ein SBS 2011 weigerte sich schon im August, das monatl. ...

Windows Netzwerk
Browser-Lags und IPv6
Erfahrungsbericht von NixVerstehen vor 7 StundenWindows Netzwerk1 Kommentar

Hallo zusammen, wir betreiben als kleines Speditionsunternehmen ein überschaubares Windows-Netzwerk mit Win10-Clients sowie einem Server 2016 Essentials als "eierlegende ...

Humor (lol)

Erstaunlich, Windows mit extremer Laufzeit (Server) lol

Tipp von mathu vor 9 StundenHumor (lol)5 Kommentare

Was es so alles gibt. :-)

Windows Netzwerk

CGM Praxisarchiv funktioniert auf Clients nach Update auf 4.14 nicht mehr

Tipp von MOS6581 vor 1 TagWindows Netzwerk

Moin, ein Kunde setzt das CGM-Praxisarchiv ein. Mehrplatzinstallation mit SQL-Server. Nachdem letzte Woche auf die 4.14 aktualisiert wurde, funktionierte ...

Heiß diskutierte Inhalte
Hyper-V
Windows Serer 2016 Standard virtualisieren
gelöst Frage von fritte87Hyper-V33 Kommentare

Hallo zusammen, ich muss für eine kleine Firma ein entsprechendes neues kleines Konzept bauen. Ich habe einen Server Standard ...

LAN, WAN, Wireless
Kombiniere mehrere 4G Router zu einem Netzwerk - Anwendung kleine LAN (10-20 Leute)
Frage von HulkTheHeroLAN, WAN, Wireless24 Kommentare

Guten Mittag liebes Administrator - Fourm, ich hoffe ich habe das richtige Thema ausgewählt - ansonsten bitte gerne verschieben ...

Windows Server
Fileserver von 2012 R2 auf 2012R2
gelöst Frage von ThabeusWindows Server23 Kommentare

Moin moin, leider war in der Vergangenheit der Fokus des Betriebs nicht auf Langfristigkeit ausgelegt. Daher stehe ich jetzt ...

Router & Routing
Größere Zahl VPN-Verbindungen mit Fritz-Box einrichten
Frage von miscmikeRouter & Routing15 Kommentare

Hallo Zusammen, ich supporte verschiedene Kunden mit bestehenden LAN-LAN-Kopplungen via FritzBox (7490, FritzOS 7.01) . Anwendungen sind z.B. Kaspersky-KSC ...