Die letzten 5 Zeilen aus einem Logfile auslesen und in umgekehrter chronologischer Reihenfolge mit Echo ausgeben
Hallo,
Ich versuche einen Batch zu schreiben der eine IP anpingt und protokolliert sobald der Ping unterbrochen wird. Unteranderem läuft auch ein Counter der die Anzahl der Unterbrechungen mitzählt.
Es werden im Batch alle protokollierten Fehler aufgelistet was aber bei einer bestimmten Menge nicht mehr sehr übersichtlich ist.
Also habe ich versucht in einer chronologisch umgekehrter Reihenfolge die letzten 5 Fehler/Zeilen in eine Variable zu speichern und diese wieder auszugeben…
Taja… ich versuche das noch immer und komm einfach nicht auf den Fehler.
Wie man sieht habe ich mich unter :_more5 schon leicht verausgabt und mehrer Lösungsansätze ausprobiert aber leider ohne Erfolg.
Jede Zeile im Log hat eine fortlaufende ID. Man könnte also direkt nach der ID Nummer suchen bzw. hab ich mit skip auch schon rumgespielt.
Irgendwie übernimmt er mir die Einträge in die Variable nicht richtig.
Ich hoffe mir kann jemand weiterhelfen.
Bin für jede Hilfe dankbar.
lg
Zendara
Ich versuche einen Batch zu schreiben der eine IP anpingt und protokolliert sobald der Ping unterbrochen wird. Unteranderem läuft auch ein Counter der die Anzahl der Unterbrechungen mitzählt.
Es werden im Batch alle protokollierten Fehler aufgelistet was aber bei einer bestimmten Menge nicht mehr sehr übersichtlich ist.
Also habe ich versucht in einer chronologisch umgekehrter Reihenfolge die letzten 5 Fehler/Zeilen in eine Variable zu speichern und diese wieder auszugeben…
Taja… ich versuche das noch immer und komm einfach nicht auf den Fehler.
@echo off & setlocal enabledelayedexpansion
call :_killer
echo IP eingeben:
set /p ip=
::set ip=192.168.8.230
set "log=D:\Test_folder\Ping_Client_Verfuegbarkeit\Ping_Client_Verfuegbarkeit.log"
REM Counter für Fehler
set "count=1"
REM x5line Variable ohne funktion
set "x5line=1"
REM lines: zählt die Fehler/Einträge
set "lines=0"
REM Platzhalter macht erst ab 5 Fehlverbindungen Sinn
set line1=0
set line2=0
set line3=0
set line4=0
set line5=0
::if exist %log% del %log%
REM Zeilen zählen
if exist %log% FOR /F "delims=:" %%A IN ('findstr /N .* "%log%"') do (
set "lines=%%A"
)
set /a "count=%lines%+1"
set /a "x5line=%lines%+1"
if %lines% GEQ 5 call :_more5
:show
cls
echo.
echo ==================================
echo %ip%
echo ==================================
echo.
echo Count = %count%
echo Error counter = %lines%
echo x5line = %x5line%
echo %line1%
echo %line2%
echo %line3%
echo %line4%
echo %line5%
echo.
echo ist online
echo.
echo ==================================
echo.
if %lines% GEQ 5 call :_show_last5
echo den ganzen Log kann man Zeilenweise auslesen
if exist %log% for /f "delims=" %%i in (%log%) do (
echo %%i
)
:scan
REM ping IP
ping %ip% -n 1 %1|find "TTL=" > nul
if %errorlevel%==1 call :lost
::goto scan
:lost
color 0c
set errtime=%time:~0,2%:%time:~3,2%:%time:~6,2%
echo ID %count% %ip% %date% %errtime% keine Verbindung >>%log%
if %lines% GEQ 5 call :_more5
ping localhost -n 2 >nul
goto count
:_more5
set /a "line1=%lines%-0"
set /a "line2=%lines%-1"
set /a "line3=%lines%-2"
set /a "line4=%lines%-3"
set /a "line5=%lines%-4"
REM liest die letzten 5 Einträge der Log Datei aus
REM inkl. verschiedener Lösungsansätze
if exist %log% for /f "delims=" %%i in (%log%) do (
for /F "delims= skip=%line1%" %%a in (%log%) do set "idline1=%%i"
)
if exist %log% for /f "delims=" %%j in (%log%) do (
for /F "delims=" %%b in ('findstr /n "ID %line2%" %log%') do set "idline2=%%j"
)
if exist %log% for /f "delims=" %%k in (%log%) do (
for /F "delims=:" %%c in ('findstr /n . "%%~k"^|findstr "^6:"') do set idline3=%%c
)
if exist %log% for /f "delims=" %%l in (%log%) do (
for /F "delims=" %%d in ('findstr /n "ID %line4%" %log%') do set "idline4=%%l"
)
::if exist %log% for /F "skip=2" %%m in (%log%) do set "idline5=%%m"
for /F %%m in ('find /N 3 %log%^') do set "idline5=%%m"
::if exist %log% for /f "delims=" %%m in (%log%) do (
:: for /F "delims=:" %%e in ('findstr /n "ID %line5%" %log%') do set "idline5=%%m"
:: )
echo _more5 %line1% - %idline1%
echo _more5 %line2% - %idline2%
echo _more5 %line3% - %idline3%
echo _more5 %line4% - %idline4%
echo _more5 %line5% - %idline5%
goto:EOF
:count
echo count
echo ==================================
echo %count% %x5line%
set /a "count=%count%+1"
set /a "x5line=%x5line%+1"
set /a "lines=%lines%+1"
::goto scan
goto show
exit
:_show_last5
echo hier sollten die letzten 5 Einträge stehen
echo !idline1!
echo !idline2!
echo %idline3%
echo %idline4%
echo %idline5%
echo.
echo ==================================
echo.
goto:EOF
:_killer
tasklist | find /i "ping.exe" >nul && D:\Test_folder\PStools\pskill ping.exe
tasklist | find /i "find.exe" >nul && D:\Test_folder\PStools\pskill find.exe
tasklist | find /i "findstr.exe" >nul && D:\Test_folder\PStools\pskill findstr.exe
tasklist | find /i "taskhost.exe" >nul && D:\Test_folder\PStools\pskill taskhost.exe
cls
goto:EOF
Wie man sieht habe ich mich unter :_more5 schon leicht verausgabt und mehrer Lösungsansätze ausprobiert aber leider ohne Erfolg.
Jede Zeile im Log hat eine fortlaufende ID. Man könnte also direkt nach der ID Nummer suchen bzw. hab ich mit skip auch schon rumgespielt.
Irgendwie übernimmt er mir die Einträge in die Variable nicht richtig.
Ich hoffe mir kann jemand weiterhelfen.
Bin für jede Hilfe dankbar.
lg
Zendara
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 275409
Url: https://administrator.de/forum/die-letzten-5-zeilen-aus-einem-logfile-auslesen-und-in-umgekehrter-chronologischer-reihenfolge-mit-echo-275409.html
Ausgedruckt am: 22.12.2024 um 22:12 Uhr
3 Kommentare
Neuester Kommentar
Warum so umständlich wenn's mit Powershell so einfach geht
Gruß jodel32
$zeilen = gc 'C:\logdatei.txt' -Tail 5
4..0 | %{$zeilen[$_]}
@ Jodel
Einer der vielen Gründe warum ich seit längerem (einem Jahr ca.) alle Skripte ausschließlich in Powershell schreibe.
@Zendara
Ich habe hier noch einen älteren Beitrag , vielleicht hilft Dir dies weiter.
Gruß, Sascha
Einer der vielen Gründe warum ich seit längerem (einem Jahr ca.) alle Skripte ausschließlich in Powershell schreibe.
@Zendara
Ich habe hier noch einen älteren Beitrag , vielleicht hilft Dir dies weiter.
Gruß, Sascha