Zweitletzte Zeile einer .txt in einer Batch anzeigen
Hey Leute, ich Experimentiere gerade etwas mit Batch und bin jetzt an einem Punkt angekommen, an dem es meine Kompetenz übersteigt. Ich habe ein Programm, mit dem ich die letzte Zeile einer .txt in einer Batchdatei anzeigen kann. Jedoch möchte ich mehr als nur die letzte Zeile anzeigen lassen (ca. 6 Zeilen) und das müsste so aufgebaut sein, dass ich es leicht Erweiten bzw Anpassen kann (mehr oder weniger "letzte Zeilen" je nach Bedarf). So nun zu meinem Programm welches ich bereits durch Internetrecherchen gefunden habe (wie das genau funktioniert hab ich noch nicht verstanden da wär ne simple Erklärung vielleicht auch nicht schlecht ist aber kein muss ^^). Die Batch sieht dann so aus:
@echo off
set "LetzteZeile="
:lesen
cls
echo.
echo ***** Anzeige *****
echo.
for /f "tokens=1" delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt"') so set "LetzteZeile=%%j"
echo\%Letztezeile%
echo.
echo *********************
timeout /t 2 >nul
goto lesen
Ich hoffe man erkennt dass "LetzteZeile=%%j" alleinstehend in einer Zeile das Resultat des automatischen Zeilenumbruchs ist (ist ja nicht unendlich Platz) und warum statt "timeout /t 2 >nul" plötzlich "& gt;nul" da steht ist mir auch ein Rätsel :D Vielen dank schon einmal im Voraus ^^
3 Antworten
Der FOR-Befehl wertet die Ausgabe des FINDSTR/N-Befehls aus. FINDSTR mit der Suchzeichenfolge "^" (als regulärer Ausdruck, ein einfacher Punkt geht auch) findet alle Zeilen in der Datei. Mit /N gibt es auch noch die zugehörige Zeilennummer aus.
Jetzt speichert es jede Zeile in die Variable "LetzteZeile". Bei jeder neuen Zeile wird jedoch der alte Wert der Variable "LetzteZeile" überschrieben, sodass letzten Endes nur die allerletzte Zeile gespeichert bleibt.
In dem FOR-Befehl sind allerdings zwei Fehler. Richtig lautet er
FOR /F "tokens=1,2 delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt') DO set LetzteZeile=%%j
Um eine beliebige Anzahl an Zeilen auszugeben, würde ich dieselbe Methode empfehlen. Allerdings muss man hierfür ermitteln, wie viele Zeilen die Datei hat. Deswegen muss man den FOR-Befehl zweimal nutzen.
set AnzahlAnzuzeigenderZeilen=5
FOR /F "tokens=1,2 delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt') DO set BisZeile=%%i
set /a AbZeile=%BisZeile% - %
AnzahlAnzuzeigenderZeilen% +1
FOR /F "tokens=1,2 delims=:" %%i in ('findstr /n "^" "C:\Beispiel.txt') DO if %%i GEQ %AbZeile% echo %%j
Mit der ersten Variable legst du fest, wie viele Zeilen angezeigt werden sollen. Hier habe ich mal "5" genommen. Der erste FOR-Befehl ermittelt, wie viele Zeilen die Zieldatei insgesamt hat. Der SET/A-Befehl errechnet die Zeilennummer, ab der geschrieben werden soll (z. B. bei 300 Zeilen gesamt ab Zeile 296 bis 300 = die 5 letzten Zeilen). Der zweite FOR-Befehl schreibt diese Zeilen.
Der IF-Befehl arbeitet im Sinne von "Wenn die aktuell ausgelesene Zeile größer oder gleich (Greater or EQual) %AbZeile% ist, schreib die Zeile".
Super ausführliche Antwort hat mir sehr weitergeholfen und funktioniert perfekt ^^ Vielen Dank :)
Du könntest eine vernünftige Shell benutzen, und dann einfach ...
tail -n2 datei.txt | head -n1
... schreiben.
Das gibt dir die zweitletzte Zeile aus. :)
Ich würde dir www.stackoverflow.com empfehlen,