Nachdem Unix fast alle wichtigen Daten Form von normalen Textdateien abspeichert, ist es natürlich sehr brauchbar, verschiedenste Tools zu haben, die alle mit Textdateien arbeiten. Es gibt davon hunderte, hier sind ein paar wichtige beschrieben, die einem das Leben oft sehr viel leichter machen können.

cat und tac

Das Programm cat arbeitet ähnlich wie das DOS-Programm TYPE. Es gibt die Dateien, die als Parameter angegeben wurden auf der Standard-Ausgabe aus. Falls keine Parameter angegeben wurden, so nimmt cat die Standard-Eingabe als Datenstrom an, der auf der Standar-Ausgabe ausgegeben werden soll.

Das klingt auf den ersten Blick trivial, wird aber sehr häufig gebraucht, um Dateien in eine Pipe oder auf ein Gerät zu schicken:

cat datei.txt > /dev/tty10

Schickt die Datei datei.txt statt auf die Standard-Ausgabe in die Gerätedatei /dev/tty10 und damit auf das Terminal 10.

Außerdem können mit cat mehrere Dateien zu einer zusammengefügt werden, indem die Ausgabe wieder in eine Datei umgeleitet wird:

cat teil1.txt teil2.txt teil3.txt > gesamt.txt

Mit Optionsschaltern kann cat auch dazu gebracht werden, mehrere aufeinanderfolgende Leerzeilen zu einer Leerzeile zu reduzieren oder Zeilen in der Ausgabe zu nummerieren.

Das Programm tac (cat umgekehrt geschrieben) gibt Dateien in umgekehrter Reihenfolge aus, also die letzte Zeile zuerst, dann die vorletzte usw. Dabei müssen es nicht zwangsläufig Zeilen sein, tac kann auch andere Zeichen als den Zeilentrenner als Trennzeichen benutzen.

tail und head

tail gibt – sofern ihm nichts anderes aufgetragen wird – die letzten 10 Zeilen einer Datei auf die Standard-Ausgabe. Mit dem Parameter –nl werden statt 10 die letzten n Zeilen ausgegeben.

head funktioniert exakt genauso, nur dass die ersten 10 Zeilen, bzw die ersten n Zeilen ausgegeben werden.

In Kombination können damit beliebige Teile einer Datei ausgeschnitten werden. Wollen wir z.B. die Zeilen 7-12 der Datei versuch.txt, so können wir zuerst mit head die ersten 12 Zeilen der Datei auschneiden und uns dann daraus die letzten 6 Zeilen mit tail entnehmen. Elegant wird das in einer Pipe:

cat versuch.txt | head -12l | tail -6l

Sowohl head, als auch tail können auch byteweise arbeiten, so dass wir uns damit dann selbst aus Binärdateien bestimmte Bereiche ausschneiden lassen können.

tail hat noch den speziellen Parameter -f, der es anweist, nicht nach der Ausgabe der letzten 10 Zeilen abzubrechen, sondern zu warten, ob die Datei noch weiter wächst und die dann angehängten Zeilen ebenfalls auszugeben. Wollen wir so etwa die Meldungen des Syslog-Daemon ständig überwachen, so schreiben wir:

tail -f /var/log/messages

Solange wir tail nicht mit Strg-C abbrechen, wird es nun die Datei /var/log/messages dauernd überwachen und jede neue Zeile auf dem Bildschirm anzeigen. Wir können also der Datei „beim Wachsen zusehen“.

cut und split

Um Dateien aufzuteilen gibt es zwei verschiedene Kommandos. split teilt Dateien in kleinere Dateien auf, um sie z.B. auf Disketten zu verteilen. cut schneidet Spalten aus Textdateien heraus.

split

Die Anwendung von split ist einfach und sie wird häufig gebraucht, um z.B. große Dateien in viele kleinere aufzuteilen, damit sie mit Disketten transportiert werden können. Die Größe der anzulegenden Zieldateien kann sowohl in Zeilen, als auch in Bytes angegeben werden.

Die kleineren Zieldateien heißen standardmäßig xaa, xab, xac, …, wobei – falls die Buchstaben nicht ausreichen – auch mehrere Buchstaben verwendet werden (xaaaa, xaaab,…). Weil das ein wenig unhandlich ist, kann man dem split-Programm ein Präfix mitgeben, das dann das x ersetzt.

Um also z.B. eine Datei netscape.tgz mit ca 13 MByte in Dateien der Größe 1 MByte aufzuteilen, um sie auf Disketten verteilen zu können, schreiben wir:

split -b 1m netscape.tgz

Als Ergebnis bekommen wir jetzt die Dateien xaa, xab, xac, … Das ist verwirrend – daher benutzen wir eben das Präfix:

split -b 1m netscape.tgz netscape_

Jetzt bekommen wir die Dateien netscape_aa, netscape_ab, …

Um diese Dateien wieder zusammenzubauen benutzen wir einfach das cat-Programm. wir könnten so also schreiben:

cat netscape_aa netscape_ab netscape_ac netscape_ad netscape_ae > netscape.tgz

Das ist zugegebenerweise etwas unhandlich, aber jetzt kommt der Vorteil ins Spiel, dass die Shell alphabetisch ihre Ausgaben sortiert. Weil die aa, ab, ac … Aufteilung streng alphabetisch ist, können wir auch viel einfacher schreiben:

cat netscape_* > netscape.tgz

cut

Mit cut werden bestimmte Spalten einer Datei ausgeschnitten und auf die Standard-Ausgabe geschrieben. Dabei können Spalten entweder durch absolute Positionen angegeben werden, oder als Felder, die durch bestimmte Trennzeichen abgegrenzt sind.

Um z.B. alle Usernamen aus der Datei /etc/passwd zu schneiden benutzen wir die Feldbegrenzer : und wollen nur das erste Feld sehen:

cut -d: -f1 /etc/passwd

Wenn wir aus der Liste aller laufender Prozesse die PIDs ausschneiden wollen, so müssen wir das mit absoluten Positionsangaben machen. Die Ausgabe von ps huax sieht ja etwa so aus:

at         172  0.0  0.4   892   448  ?  S    10:09   0:00 /usr/sbin/atd 
bin        128  0.0  0.3   816   360  ?  S    10:09   0:00 /sbin/portmap
...

Die ProzeßIDs stehen also von Zeichen 9 bis 14. Um genau diese Spalte auszuschneiden schreiben wir also:

  
ps huax | cut -c9-14 

So bietet uns cut also die Möglichkeit, jeden beliebigen Teil einer Zeile auszuschneiden und auf die Standard-Ausgabe zu schreiben. Das ist natürlich hervorragend geeignet, um in Pipes weiterverarbeitet zu werden. Nehmen wir doch mal spaßhalber an, wir wollen aus einer Datei testdatei das zweite Wort der fünften Zeile. Wie oben gezeigt, kann eine bestimmte Zeile durch Kombination aus head und tail aus einer Datei herausgelesen werden. Das zweite Wort ergibt sich durch das Trennzeichen Leerzeichen. Also schreiben wir:

cat testdatei | head -5l | tail -1l | cut -d" " -f2 

Mit dieser Kombination ist dann wirklich der Zugriff auf jeden einzelnen Buchstaben innerhalb beliebiger Dateien möglich.

paste

paste verknüpft zwei oder mehrere Dateien zeilenweise, so dass die ersten Zeilen der Dateien zur ersten Zeile der Ausgabedatei werden.

Damit können also einzelne Dateien, die Spalten enthalten, die etwa von cut erzeugt wurden, wieder zu einer Datei zusammengesetzt werden. Nehmen wir ein simples Beispiel:

Wir wollen eine Datei erstellen, in der in der ersten Spalte die UserID, in der zweiten der Username steht. Die Datei soll alle User des Systems enthalten. Wir können das nicht allein mit cut erledigen, weil ja in /etc/passwd zuerst der Username und erst im 3. Feld die UserID steht. Zunächst erzeugen wir also zwei Dateien, die jeweils nur eine Spalte der /etc/passwd beinhalten, dann fügen wir diese beiden Dateien umgekehrt wieder zusammen:

cut -d: -f1 /etc/passwd > Datei1
cut -d_ -f3 /etc/passwd > Datei2
paste -d: Datei2 Datei1 > Datei3