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

Source: https://www.jpkc.com/db/cheatsheets/files-text/tail/

<!-- PROSE:intro -->
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.
<!-- PROSE:intro:end -->

## Grundlagen

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

```bash
tail error.log
```

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

```bash
tail -n 50 access.log
```

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

```bash
tail -20 error.log
```

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

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

```bash
tail -f /var/log/syslog
```

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

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

```bash
tail -F /var/log/app.log
```

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Byte-Modus

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

```bash
tail -c 200 data.bin
```

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

```bash
tail -c 1M large-file.log
```

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

```bash
tail -c +100 data.bin
```

## Mehrere Dateien

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

```bash
tail error.log access.log
```

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

```bash
tail -n 5 *.log
```

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

```bash
tail -q -n 1 *.csv
```

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

```bash
tail -v -n 5 data.txt
```

## Pipelines

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

```bash
history | tail
```

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

```bash
git log --oneline | tail -n 5
```

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

```bash
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).

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

## Typische Muster

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

```bash
tail -n +2 data.csv
```

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

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

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

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

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

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

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

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

<!-- PROSE:outro -->
## 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.

## Weiterführende Links

- [Wikipedia: tail (Unix)](https://de.wikipedia.org/wiki/Tail_(Unix)) – Überblick und Funktionsweise des Kommandos
- [ubuntuusers-Wiki: tail](https://wiki.ubuntuusers.de/tail/) – deutschsprachige Einführung mit Beispielen
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [head](https://www.jpkc.com/db/cheatsheets/files-text/head/) – den Anfang von Dateien anzeigen
- [less](https://www.jpkc.com/db/cheatsheets/files-text/less/) – Dateien seitenweise durchblättern (mit +F ebenfalls folgen)
- [grep](https://www.jpkc.com/db/cheatsheets/files-text/grep/) – Zeilen nach Mustern durchsuchen

