tail — Das Ende von Dateien anzeigen und Logs verfolgen

Praxis-Guide zu tail: die letzten Zeilen einer Datei anzeigen und Logdateien mit -f/-F in Echtzeit verfolgen, filtern und überwachen.

tail zeigt dir das Ende einer Datei – standardmäßig die letzten 10 Zeilen. Seine berühmteste Funktion ist der Follow-Modus -f: Damit verfolgst du eine Logdatei in Echtzeit und siehst neue Einträge, sobald sie geschrieben werden. Achte auf den Unterschied zwischen -f (folgt dem geöffneten Dateideskriptor) und -F (folgt dem Dateinamen und öffnet die Datei nach einer Rotation neu) – bei rotierenden Logs ist fast immer -F die richtige Wahl. Mit -n +N springst du an eine Startzeile, etwa um die Kopfzeile einer CSV zu überspringen. Dieser Guide führt dich durch Follow-Modus, Bereichsauswahl und die wichtigsten Pipeline-Muster.

Grundlagen

tail <file> — Die letzten 10 Zeilen einer Datei anzeigen (Standard).

tail error.log

tail -n <count> <file> — Die letzten N Zeilen einer Datei anzeigen.

tail -n 50 access.log

tail -<count> <file> — Kurzform für -n. Die letzten N Zeilen anzeigen.

tail -20 error.log

tail -n +<line> <file> — Alle Zeilen ab Zeile N anzeigen (die ersten N-1 Zeilen überspringen).

tail -n +2 data.csv

Follow-Modus (Echtzeit-Überwachung)

tail -f <file> — Einer Datei folgen. Neue Zeilen in Echtzeit ausgeben, sobald sie angehängt werden.

tail -f /var/log/syslog

tail -f <file1> <file2> — Mehreren Dateien gleichzeitig folgen, mit Dateinamen-Kopfzeilen.

tail -f /var/log/nginx/access.log /var/log/nginx/error.log

tail -F <file> — Folgen mit Wiederholung. Folgt weiter, auch wenn die Datei rotiert oder neu angelegt wird.

tail -F /var/log/app.log

tail -f -n <count> <file> — Die letzten N Zeilen anzeigen und dann weiter folgen.

tail -f -n 50 /var/log/syslog

tail -f -n 0 <file> — Einer Datei folgen und nur neue Zeilen ab jetzt anzeigen (ohne Verlauf).

tail -f -n 0 /var/log/app.log

tail -f <file> --pid=<pid> — Einer Datei folgen und stoppen, sobald der angegebene Prozess endet.

tail -f output.log --pid=$!

tail -f -s <seconds> <file> — Folgen mit eigenem Prüfintervall zwischen den Durchläufen (Standard: 1 Sekunde).

tail -f -s 0.1 /var/log/app.log

Follow-Modus mit Filterung

tail -f <file> | grep '<pattern>' — Einer Datei folgen und nur Zeilen anzeigen, die einem Muster entsprechen.

tail -f /var/log/syslog | grep 'ERROR'

tail -f <file> | grep --line-buffered '<pattern>' — Folgen mit grep und Zeilenpufferung für sofortige Ausgabe.

tail -f access.log | grep --line-buffered '500'

tail -f <file> | grep -v '<pattern>' — Einer Datei folgen und Zeilen ausschließen, die einem Muster entsprechen.

tail -f access.log | grep -v 'healthcheck'

tail -f <file> | grep --color '<pattern>' — Einer Datei folgen und passende Muster farbig hervorheben.

tail -f /var/log/app.log | grep --color -E 'ERROR|WARN|$'

tail -f <file> | awk '/<pattern>/ {print}' — Folgen mit awk für komplexere Filterung und Feldauswahl.

tail -f access.log | awk '$9 >= 500 {print}'

Byte-Modus

tail -c <bytes> <file> — Die letzten N Bytes einer Datei statt Zeilen anzeigen.

tail -c 200 data.bin

tail -c <size>K <file> — Die letzten N Kilobytes anzeigen. Unterstützt die Suffixe K, M, G.

tail -c 1M large-file.log

tail -c +<offset> <file> — Alle Bytes ab Byte N anzeigen (die ersten N-1 Bytes überspringen).

tail -c +100 data.bin

Mehrere Dateien

tail <file1> <file2> — Die letzten 10 Zeilen jeder Datei mit Dateinamen-Kopfzeilen anzeigen.

tail error.log access.log

tail -n <count> <file1> <file2> — Die letzten N Zeilen mehrerer Dateien anzeigen.

tail -n 5 *.log

tail -q <file1> <file2> — Stiller Modus. Dateinamen-Kopfzeilen bei mehreren Dateien unterdrücken.

tail -q -n 1 *.csv

tail -v <file> — Ausführlicher Modus. Immer eine Dateinamen-Kopfzeile anzeigen, auch bei einer einzelnen Datei.

tail -v -n 5 data.txt

Pipelines

<command> | tail — Nur die letzten 10 Zeilen einer Befehlsausgabe anzeigen.

history | tail

<command> | tail -n <count> — Nur die letzten N Zeilen einer Befehlsausgabe anzeigen.

git log --oneline | tail -n 5

<command> | tail -n 1 — Nur die letzte Zeile der Ausgabe holen.

wc -l *.py | tail -n 1

sort <file> | tail -n <count> — Die letzten N Einträge nach dem Sortieren anzeigen (z. B. die größten Werte).

du -sh */ | sort -h | tail -n 5

Typische Muster

tail -n +2 <file> — Die Kopfzeile überspringen und alle restlichen Datenzeilen anzeigen.

tail -n +2 data.csv

head -n <end> <file> | tail -n <count> — Einen bestimmten Zeilenbereich aus einer Datei ausschneiden.

head -n 20 data.txt | tail -n 5

tail -n +<start> <file> | head -n <count> — Alternative Bereichsauswahl: ab Zeile N beginnen und M Zeilen nehmen.

tail -n +10 data.txt | head -n 5

tail -f /var/log/*.log — Alle Logdateien eines Verzeichnisses gleichzeitig überwachen.

tail -f /var/log/nginx/*.log

tail -f <file> | tee <output_file> — Einer Datei folgen und die Ausgabe gleichzeitig in eine andere Datei speichern.

tail -f app.log | tee filtered.log

tail -f <file> | while read line; do echo "$(date): $line"; done — Einer Datei folgen und jeder neuen Zeile einen Zeitstempel voranstellen.

tail -f app.log | while read line; do echo "$(date '+%H:%M:%S'): $line"; done

Fazit

tail ist das Standardwerkzeug zum Beobachten von Logdateien und das Gegenstück zu head. Die wichtigste Entscheidung im Alltag: -f folgt der Datei über ihren Deskriptor und „verliert" sie, wenn ein Logrotate sie wegrotiert; -F dagegen folgt dem Pfad und öffnet die neue Datei automatisch – für produktive Logs ist -F daher meist die sichere Wahl. Beim Filtern in Echtzeit brauchst du oft grep --line-buffered, sonst hält die Pufferung in der Pipeline die Ausgabe zurück. Und denk daran, dass tail -f von sich aus nicht endet – beende es mit Strg-C oder binde es mit --pid an die Lebensdauer eines Prozesses.

Verwandte Kommandos

  • head – den Anfang von Dateien anzeigen
  • less – Dateien seitenweise durchblättern (mit +F ebenfalls folgen)
  • grep – Zeilen nach Mustern durchsuchen