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

Auslesen der drittletzten Zeile ..

Frage Entwicklung Batch & Shell

Mitglied: .Sessl

.Sessl (Level 1) - Jetzt verbinden

26.02.2014, aktualisiert 27.02.2014, 1352 Aufrufe, 11 Kommentare, 2 Danke

Hallo zusammen,

ich habe nach einer ganzen Weile, mit Eurer Hilfe bei ähnlichen Problemen, mir ein funktionierendes Script gebastelt.
Mein Problem ist, dass je größer die Logdatei wird, der Durchlauf Ewigkeiten dauert.

Meine Frage, was könnte ich noch verbessern bzw. mir an Code sparen um das Script evtl. performanter zu machen?


Was macht das Script:
Eine Installationsroutine schreibt in ein vorgegebenes Logfile den akt. Status der Installation, sollte es einen Fehler geben oder fertig sein, wird am Ende der Logdatei eine Anweisung geschrieben.
Genau diese Anweisung möchte ich aus dem Log auslesen und mich darüber per Mail informieren lassen.

Das Problem, nachdem die Anweisung ins Log geschrieben wurde, werden noch zwei Leerzeilen angefügt, so dass ich nicht sagen kann, ließ mir die letzte Zeile aus.
Aus diesem Grund lasse ich das Script zwei mal durchlaufen. Im ersten Durchlauf wird die Anzahl der Zeilen ausgekundschaftet und 2 abgezogen. Im zweiten Lauf nun die "letzte" ausgelesen.

Ein weiteres Problem ist, wenn im ersten Lauf 388.082 Zeilen gezählt werden, die Datei aber in diesem Augenblick befüllt wird, evtl. sogar mit der ersehnten Anweisung, wird diese jedoch noch nicht im zweiten Lauf wahrgenommen, da ja die Zeile 388.080 ausgelesen wird. D.h. erst in einem weiteren kompletten Lauf wird die Anweisung erkannt, ausgewertet und mir eine E-Mail geschickt.

Ich hoffe Ihr könnt mir folgen, falls nicht, einfach fragen.


01.
@echo off 
02.
 
03.
set "instlog=c:\inst.log" 
04.
set "anweisung=Waiting for an answer from GUI" 
05.
 
06.
:start 
07.
 
08.
:: Nummer der letzten Zeile ausfindig machen und zwei Zeilen abziehen (Leerzeilen im Log) 
09.
FOR /F "delims=:" %%A IN ('findstr /N .* "%instlog%"') DO set "zeile=%%A" 
10.
set /A "zeile=%zeile%-2" 
11.
 
12.
:: Inhalt der Vorvorletzen Zeile in eine Variable einlesen 
13.
Set /a "cnt=1" 
14.
Set /a "n=%zeile%" 
15.
for /F "delims=" %%i in ('findstr /N .* "%instlog%"') do call :setvarFixLine %n% "%%i"  
16.
 
17.
goto step1 
18.
 
19.
:: Sprungmarke #setvarFixLine 
20.
:setvarFixLine 
21.
If %cnt%==%1 Set "Var=%~2" 
22.
Set /a "cnt+=1"  
23.
goto :eof 
24.
:: Sprungmarke #setvarFixLine 
25.
 
26.
 
27.
:step1 
28.
 
29.
:: Inhalt der Variable (VAR) zurecht stutzen 
30.
set "var=%var:~-30,30%" 
31.
 
32.
:: Inhalt der Variable mit dem gewünschten Zeileninhalt vergleichen 
33.
if "%var%" EQU "%anweisung%" goto gui_wait 
34.
 
35.
goto start 
36.
 
37.
 
38.
:gui_wait 
39.
Ausgabe per Email .. 
40.
 
ps. könnte mir noch jmd erklären, was es mit ("Var=%~2") bei setvarFixLine auf sich hat?

Vielen Dank.

Gruß
Tobias
Mitglied: Sheogorath
26.02.2014, aktualisiert um 21:34 Uhr
Moin,

wie wäre es damit:
01.
@echo off 
02.
 
03.
set "instlog=c:\inst.log" 
04.
set "anweisung=Waiting for an answer from GUI" 
05.
 
06.
:start 
07.
findstr /c:"%anweisung%" "%instlog%">nul 
08.
if %errorlevel% eq 0 ( 
09.
 goto :gui_wait 
10.
11.
goto :start 
12.
 
13.
 
14.
:gui_wait 
15.
Ausgabe per Mail
Gruß
Chris
Bitte warten ..
Mitglied: bastla
26.02.2014, aktualisiert um 21:44 Uhr
... oder etwas kürzer (ab Zeile 7)
01.
findstr /ic:"%anweisung%" "%instlog%">nul || goto :start 
02.
echo Ausgabe Mail
Ansonsten noch ein Hinweis: Wenn die letzten beiden Zeilen leer sind, würde ein
for /f "usebackq delims=" %%i in ("%instlog%") do set "Zeile=%%i"
in der Varaiablen %Zeile% den Inhalt der letzten nicht leeren Zeile liefern, wobei aber natürlich trotzdem einmal alle Zeilen durchlaufen werden müssten.

Grüße
bastla
Bitte warten ..
Mitglied: .Sessl
26.02.2014 um 22:03 Uhr
Hi,

vielen Dank für die schnellen Antworten.

Was ich vergessen hatte zu erwähnen ist, dass das Logfile fortlaufend ist. Soll heißen, falls es während der Installation bereits mehrfach zu Zwischenfällen kam, wird die Anweisung auch mehrfach im Logfile stehen. Deshalb kann ich nicht einfach von oben nach unten oder umgekehrt suchen, da beim simplen durchgehen ältere Einträge gefunden werden, was wiederum ein Fehlverhalten nach sich zieht.

Mein Fehler .. Sorry!!!
Bitte warten ..
Mitglied: pieh-ejdsch
LÖSUNG 26.02.2014, aktualisiert 27.02.2014
moin,

var wird mit den zweiten Parameter, der in der forschleife übergeben wird, befüllt. Ist aber nicht sehr performant, da jede Zeilennummer für sich überprüft wird.
Alternativ:
01.
for /f %%i in (' "find /c /v "" <logfile.log" ') do set /a n = %%i -2 
02.
more +%n% logfile.log |find "%Anweisung%" && echo mach was....
@chris, er will doch die letzte gültige Zeile im LOG auslesen. Das wird wohl schon paarmal drinstehen.

01.
@echo off 
02.
 
03.
set "instlog=c:\inst.log" 
04.
set "anweisung=Waiting for an answer from GUI" 
05.
 
06.
set "Anweisung=%Anweisung: =^ %" 
07.
 
08.
:start 
09.
for /f "usebackq tokens=1-6" %%a in ("%instlog%") do if %%a^ %%b^ %%c^ %%d^ %%e^ %%f equ %Anweisung% (set OK=1) else set "OK=" 
10.
if defined OK goto :gui_wait 
11.
goto :start 
12.
 
13.
:gui_wait 
14.
 rem Ausgabe per Mail ..
[OT]
man diese Surface TastaturMatte ist echt gewöhnungsbedürftig ....
[/OT]

Gruß Phil
Bitte warten ..
Mitglied: bastla
26.02.2014, aktualisiert 03.03.2014
@ PH
Das wird wohl schon paarmal drinstehen.
Ist ja egal, wie oft - wenn das letzte Vorkommen gefragt ist, genügt eine Schleife über das "findstr"-Ergbenis:
01.
set "Meldung=" 
02.
for /f "delims=" %%i in ('findstr /ic:"%anweisung%" "%instlog%"') do set "Meldung=%%i" 
03.
if not defined Meldung goto :start 
04.
echo Mail mit %Meldung%
Grüße
bastla
Bitte warten ..
Mitglied: Endoro
LÖSUNG 27.02.2014, aktualisiert um 15:08 Uhr
Hey,
Batch ist 1. langsam und 2. für grosse Textdateien nicht geeignet, weil da vieles wie zB die For Schleife nicht funktioniert. Nimm dann entweder eine andere Scriptsprache oder GNUWin32 for Windows.

Hier ein Beispiel für die "drittletzte" Zeile, wobei der Text nur einmal durchlaufen wird:
01.
@ECHO OFF &SETLOCAL disableDelayedExpansion 
02.
FOR %%a IN (*.txt) DO CALL:GetLine "%%~a" 
03.
GOTO:EOF 
04.
 
05.
:GetLine 
06.
SETLOCAL enableDelayedExpansion 
07.
FOR /f "usebackqdelims=" %%b IN ("%~1") DO ( 
08.
	SET "LastButTwo=!SecondLast!" 
09.
	SET "SecondLast=!Last!" 
10.
	SET "Last=%%b" 
11.
12.
ECHO(Drittletzte Zeile IN "%~1" ist: 
13.
ECHO(!LastButTwo! 
14.
EXIT /b
Hier wieder batchtypische Einschränkungen:
1) alle Ausrufezeichen werden gelöscht
2) funktioniert nicht mit utf-8/utf-16 bzw. Unicode
3) Leerzeilen werden nicht mitgezählt
Gruss.
Bitte warten ..
Mitglied: .Sessl
27.02.2014 um 14:27 Uhr
Hallo Chris,

funktioniert leider nicht.
Die Schleife läuft unentwegt durch und findet die Anweisung generell nicht.

Trotzdem Danke!
Bitte warten ..
Mitglied: .Sessl
27.02.2014, aktualisiert 03.03.2014
Hallo Phil,

vielen Dank für deine Hilfe!
Das Script funktioniert bestens, läuft mit 12 sek. bei 420.000 Zeilen sogar sehr schnell, kommt aber Performancetechnisch nicht an bastla's Script (2 sek.) ran.

Dennoch vielen Dank für den weiteren Denkanstoß, wird mir sicher noch bei weiteren Projekten hilfreich sein!

Danke!


Gruß
Tobias


[edit]

Mein Fehler!
Dein Script ist das einzig zu 100% funktionierende. Ich danke dir!

[/edit]
Bitte warten ..
Mitglied: .Sessl
27.02.2014 um 14:45 Uhr
Hallo bastla,

oh man, dümmer hätte ich mich glaube nicht anstellen können :/
Danke fürs vereinfachen und mit der Laufzeit von 2 Sek. bei 420.000 Zeilen rasant, performanter geht's nicht.

Vielen Dank für die Hilfe!


Gruß
Tobias
Bitte warten ..
Mitglied: .Sessl
27.02.2014 um 15:07 Uhr
Hallo Endoro,

naja für die 3. Einschränkung habe ich ja den 1. Lauf gehabt, welche die Leerzeilen mit gezählt hatte.
Aber auch dir ein Dankeschön für den Lösungsansatz, funktioniert ebenfalls sehr gut.

Danke.

Gruß
Tobias
Bitte warten ..
Mitglied: .Sessl
03.03.2014 um 15:14 Uhr
Das Problem, so bald ein weiterer Eintrag irgendwo schon mal im Log vorkam, wird dieser gezogen. Hilf leider nicht ganz.
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

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

Ähnliche Inhalte
Installation
gelöst Mit Powershell in einer Datei eine Zeile auslesen (6)

Frage von Bommi1961 zum Thema Installation ...

Batch & Shell
gelöst Powershell funktioniert nicht richtig beim Auslesen der letzten Zeile (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Batch & Shell
gelöst Appx aus Image auslesen und entfernen (9)

Frage von Markus2016 zum Thema Batch & Shell ...

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 ...