News Ticker

Unix-Tools 2: head & tail

Unix und Linux bieten viele kleine Werkzeuge, die genau eine einzige Aufgabe bewältigen – dafür aber hervorragend. Die zwei Tools die heute vorgestellt werden, geben den Anfang bzw. das Ende einer Datei aus. Sie haben zwar nur wenige Optionen, dafür aber einige, die beim debuggen wirklich von Interesse sein können. Lasst euch also überraschen was man mit head und tail alles anstellen kann.


Wir fangen mit head an. Es wird normalerweise mit head [datei 1] … [datei n] aufgerufen. Sollte keine Datei angegeben sein, wird die Standardeingabe verwendet. Ich habe einige kleine Dateien angelegt, um die Benutzung zu verdeutlichen. head -n 1 datei1 datei2 datei3 gibt folgendes zurück:

==> datei1 <==
1

==> datei2 <==
a

==> datei3 <==
Das

-n 1 weist head an, nur die erste Zeile jeder Datei auszugeben. -n -5 zeigt alles außer der letzten 5 Zeilen an. Nur das erste Zeichen kann mit -c 1 (character, dt. Zeichen) ausgeben werden. Wenn man zudem nicht angezeigt bekommen will aus welcher Datei der Inhalt stammt, kann man -q (quite, dt. still) verwenden. Das waren eigentlich auch schon alle interessanten Optionen, jetzt zu tail.

tail ist das Gegenstück zu head. Es zeigt das Ende bestimmer Dateien an. Auch hier kann wieder -c für Zeichen, -n für Linien, -q für reinen Output verwendet werden. (-n -2 zeigt im Fall tail alles ab der zweiten Zeile an.) Eine wichtige Option, die hauptsächlich nur für tail Sinn macht, ist -f (follow, dt. folgen). Damit wird der Inhalt einer Datei jede fünfte Sekunde ausgegeben. Bekannt ist der Befehl tail -f /var/log/messages unter Linux, um die allgemeine Log-Datei zu beobachten (während man z.B. einen iPod anschließt um zu erfahren welche Gerätedatei dem Gerät zugewiesen wird). Wem fünf Sekunden zu viele sind, kann das mit -s (sleep intervall, dt. Schlafintervall) ändern. tail -n 5 -s 1 -f /var/log/messages gibt also jede Sekunde die letzten 5 Zeilen der Datei /var/log/messages auf dem Bildschirm aus:

Jun 15 08:00:51 tcr kernel: [ 38.703095] kjournald starting. Commit interval 5 seconds
Jun 15 08:00:51 tcr kernel: [ 38.703117] EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
Jun 15 08:00:51 tcr kernel: [ 38.704944] EXT3 FS on sdc2, internal journal
Jun 15 08:00:51 tcr kernel: [ 38.704955] EXT3-fs: mounted filesystem with ordered data mode.
Jun 15 08:00:57 tcr pulseaudio[1517]: ratelimit.c: 1 events suppressed

Sobald sich auf dem System etwas verändert und es in die Log-Datei geschrieben wird, wird es auch direkt auf dem Bildschirm angezeigt. Falls die Datei noch nicht existiert, man aber sofort den Inhalt haben möchte wenn sie erstellt wird, kann man -F verwenden (Unix/Linux unterscheidet zwischen Groß- und Kleinschreibung):

titan% tail -n 5 -F datei4
tail: cannot open `datei4' for reading: No such file or directory
[Auf einer anderen Konsole erstelle ich die Datei "datei4" mit dem Inhalt "TEST!"]
tail: `datei4' has appeared; following end of new file
TEST!

Auch noch zu erwähnen ist der –-pid (Process ID, dt. Prozess-ID) Schalter, der den tail-Prozess automatisch terminiert wenn der Prozess, der die ausgegebene Datei besitzt, terminiert. Wenn z.B. Firefox in die Log-Datei schreibt kann es interessant sein diese mit tail zu verfolgen. Wenn nun aber Firefox beendet wird, wird es keine neuen Inhalte in der Datei geben; deswegen ist auch ein tail unnotwendig und wird mit -F automatisch beendet.

Bleibt nur noch viel Spaß beim Ausprobieren zu wünschen. 😉