Kleine Tools wie head, tail und cat zeigen den Inhalt von Textdateien an. Sie erfüllen jedoch alle eine spezielle Funktion, die andere Unix-Kommandos nicht bieten.
Zu Befehl
Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder GNOME regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
Zum Anzeigen von Textdateien stehen Ihnen unter Linux viele Programme zur Verfügung. Natürlich können Sie jederzeit einen Editor wie Vi oder Emacs oder einen Pager wie less oder more starten, um solche Files zu lesen. Es geht aber auch mit einfachen Tools wie cat, head und tail.
Multifunktional – cat
Das Programm cat verkettet (engl.: “to concatenate”) nicht nur mehrere Dateien zu einer, es eignet sich auch dazu, einzelne Files auf der Standardausgabe anzuzeigen. Der einfache Aufruf cat datei.txt bringt den Inhalt der Datei auf den Bildschirm.
Manchmal ist es praktisch, eine Textdatei mit Zeilennummern zu versehen, um beispielsweise bei der Diskussion von Programmlistings auf eine bestimmte Zeile Bezug zu nehmen. Dafür bietet cat die Option -n und gibt damit zu Beginn jeder Zeile die Zeilennummer aus.
Vorsicht allerdings bei binären Formaten: gibt man aus Versehen eine Binärdatei mit cat aus, sind oft nur noch Sonderzeichen zu sehen und auch die Eingabe wird unleserlich (Abbildung 1). Abhilfe schafft hier das Programm reset: Tippen Sie (blind) reset am Prompt und drücken Sie [Return], um das Terminal zu reparieren. Falls auch das nicht hilft, probieren Sie es mit echo [Strg-v][Esc][c][Return].
Häufig wird cat dazu verwendet, Dateien durch eine Pipe an ein anderes Programm zu schicken. So lässt sich eine Liste mit cat ausgeben und direkt an das Kommando sort[1] weiterleiten:
$ cat liste.txt | sort Arnie 42 Egbert 120 Hubert 30 Petronella 100
Die Ausgabe von cat lässt sich mit den für Unix typischen Mitteln umlenken: mit dem Operator > schreiben Sie den Output in die neue datei2:
cat datei1 > datei2
Das funktioniert auch mit mehreren Dateien. Dazu führen Sie die Dateinamen einfach nacheinander auf:
cat datei1 datei2 > datei3
Existiert datei3 noch nicht, wird sie angelegt. Ist sie allerdings schon vorhanden, überschreibt cat sie einfach. Mit einem anderen Operator bringen Sie cat dazu, an vorhandene Dateien anzuhängen:
cat datei1 datei2 >> datei3
Leiten Sie die Ausgabe wie in diesen Beispielen in eine Datei um, verarbeitet cat auch problemlos Binärdateien. So ist es möglich, große Dateien mit split in kleinere Pakete zu zerlegen und sie danach mit cat wieder zusammenzufügen. Anwendungen hierfür sind der Transport von Daten mit Disketten oder das Verschicken über E-Mail.
Einige Newsgruppen wie comp.unix.shell vergeben seit Jahren regelmäßig den “Useless Use of Cat Award”[2]. Der Preis geht an denjenigen, der den unsinnigsten Gebrauch des Kommandos cat vorschlägt – Begründung: “Mit cat sollte man Dateien verketten. Es ist reine Zeitverschwendung, ein einziges File mit nichts zu verknüpfen, und kostet einen Prozess”. Unter diesem Gesichtspunkt mögen manche LeserInnen das eine oder andere Beispiel auch als “useless” ansehen. Jedenfalls entspricht auch eine redundante Anwendung von cat dem Unix-Prinzip, kleine Programme mit Hilfe von Pipes zu verketten. Bei moderner Hardware dürften die “Kosten” für einen zusätzlichen Prozess leicht zu verschmerzen sein.
Aller Anfang ist head
Der Name ist Programm: Mit head (engl.: “Kopf”) geben Sie die ersten Zeilen einer Datei am Bildschirm aus. Standardmäßig schreibt der Aufruf head datei.txt die ersten zehn Zeilen auf den Bildschirm. Die Option -n nummer verändert diese Vorgabe. Die Konfigurationsdateien im Verzeichnis /etc enthalten in den ersten Zeilen häufig den Namen und Verwendungszweck der Datei. Um von sämtlichen dort liegenden Files die ersten drei Zeilen auszugeben, verwenden Sie den Aufruf head -n 3 *.conf.
Praktisch: Lassen Sie head auf mehr als eine Datei los, fügt das Tool eine optische Trennung ein (Listing 1). Wer auf dieses Feature verzichten möchte, verwendet den Parameter -q (für --quiet).
Listing 1
head mit mehreren Files gibt Trenner aus
huhn@asteroid:/etc$ head -n 3 *.conf ==> aatv.conf <== # aatv configuration file. # Video mode. Choose between PAL, SECAM and NTSC. ==> abcde.conf <== # System defaults for abcde. # Nothing in this file is uncommented by default. # ==> adduser.conf <== …
Happy End
Das Kommando tail (engl.: “Ende, Rest”) arbeitet ähnlich, gibt aber, wie der Name vermuten lässt, die letzten Zeilen einer Datei aus. Auch hier dürfen mehrere Dateien zur Ausgabe übergeben werden. Neben dem Parameter -n nummer (default ist wie bei head zehn) wird oft die Option -f (Langform: --follow) verwendet. Damit kann man sich das Ende von Dateien anschauen, die immer weiter anwachsen, wie beispielsweise Logfiles. So zeigt tail, auf ein ISDN-Logfile losgelassen, wer gerade durchklingelt (Listing 2).
Listing 2
Verkettung von
tail -f
und
grep
root@marvin[~] tail -f /var/log/isdn/isdnlog | grep RING Sep 25 13:25:51 * Call to tei 127 from +49 170/1111111, Deutschland Mobilfunk D1/Deutschland Mo on +49 221/40, Köln RING (Speech) Sep 25 13:31:09 * Call to tei 127 from +49 89/4444444, München on +49 221/40, Köln RING (Speech) Sep 27 12:38:30 * Call to tei 127 from ? on +49 221/42, Köln RING (3.1 kHz audio)
Den gleichen Effekt erzielen Sie übrigens mit dem Pager less, wenn Sie einfach [Shift-f] drücken, während er ein File anzeigt. Das Programm wartet dann auf neue Zeilen in der Datei (zu erkennen in der Statuszeile Waiting for data... (interrupt to abort)). Den “Follow”-Modus verlassen Sie durch [Strg-c].
Glossar
-
Standardausgabe
-
Es gibt drei “Standardkanäle” für Ein- und Ausgabe, stdin (Standardeingabe), stdout (Standardausgabe) und stderr (Standardfehlerausgabe). Die Standardeingabe entspricht meist der Tastatur, während Standardausgabe und im allgemeinen auch Standardfehlerausgabe auf dem Bildschirm erscheinen. Durch spezielle Operatoren (>,<) lassen sich alle Kanäle “umleiten” (engl.: “I/O redirection”), also beispielsweise die Standardfehlerausgabe in eine Datei.
-
Pipe
-
Ermöglicht es, mehrere Befehle zu verketten, indem die Pipe (engl.: “Röhre, Rohrleitung”) die Ausgabe eines Kommandos zur Eingabe eines anderen macht. Pipes werden mit dem |-Zeichen gebildet. So leitet der Aufruf ls -l | less die Ausgabe des ls-Kommandos an less weiter, das den Text seitenweise am Bildschirm anzeigt.
Infos
[1] Heike Jurzik: “Richtige Reihenfolge”, LinuxUser 04/2002, S.76, http://www.linux-user.de/ausgabe/2002/04/076-zubefehl/sort.html
[2] Useless Use of Cat Award: http://rhols66.adsl.netsonic.fi/era/unix/award.html#cat





