Die Werkzeuge der Linux-Shell sind oft hochspezialisiert: Einige von ihnen erledigen nur eine einzige Aufgabe, aber die beherrschen sie dann in Perfektion. Die Kombination mehrerer dieser kleinen Tools macht die Shell so leistungsfähig.
Im ersten Teil unserer Einführung in die Shell [1] haben wir einige grundlegende Schritte in der Shell beschrieben: Dort ging es darum, eine Shell im Terminalfenster zu starten, einfache Befehle einzugeben und ein wenig mit Dateien zu arbeiten (kopieren, verschieben, umbenennen, löschen). Mit diesen Vorkenntnissen können Sie sich nun an einige anspruchsvollere Aufgaben heran wagen; dabei lernen Sie nützliche Spezialwerkzeuge kennen.
Blick in die Datei
Der Shell-Befehl cat ist die Kurzform des englischen Worts “concatenate” (aneinanderhängen) und eigentlich dafür zuständig, mehrere Dateien zu einer einzigen (neuen) Datei zusammenzufassen. Das Kommando akzeptiert aber auch einen einzelnen Dateinamen als Argument und gibt dann den Dateiinhalt im Terminalfenster aus. Testen Sie die Funktion, indem Sie z. B. den Inhalt der Datei /etc/hosts anzeigen (siehe Kasten Ausgabe mit “cat”).
Ausgabe mit “cat”
esser@netbookhg:~$ cat /etc/hosts 127.0.0.1 localhost 127.0.1.1 netbookhg # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Unter Linux sind fast alle Konfigurationsdateien für das Betriebssystem und auch für die meisten Anwendungsprogramme reine Textdateien, deren Inhalt Sie so in der Shell schnell unter die Lupe nehmen können. Nun ist /etc/hosts eine auf den meisten Computern recht überschaubare Datei, bei längeren Dateien ist die einfache Ausgabe mit cat aber unbefriedigend, weil der Inhalt einfach durch das Fenster läuft. Sie könnten nun mit Hilfe der Bildlaufleiste bis zur gesuchten Stelle zurück scrollen, aber es gibt spezielle Tools, die das Betrachten von Dateien erleichtern.
Mehr oder weniger: “less”
Das am häufigsten verwendete Tool zum Anzeigen von Dateien ist less (deutsch: weniger), und sein Name bedarf einer Erklärung. Auf älteren Unix-Systemen (den Vorläufern von Linux) gab es ein Tools namens more (deutsch: mehr), das eine Datei seitenweise anzeigte: Es löschte dazu den Bildschirm, zeigte dann einige (meist 24) Zeilen aus der Datei an und schrieb in die letzte Zeile das Wort “MORE” – als Aufforderung an den Benutzer, eine Taste zu drücken, um die nächste “Seite” anzuzeigen. Das klassische more-Kommando gibt es auch unter Linux noch, aber zusätzlich auch die leistungsfähigere Version less: Die Entwickler von less haben ihrer verbesserten Version von more also als Namen das Gegenteil des Originalprogrammnamens verpasst.
Nach der länglichen Historie des Kommandos nun zur Anwendung: Viele überlange Textdateien finden Sie im Verzeichnis /var/log/, das die Protokolldateien (englisch: “log files”) des Systems enthält. Die meisten davon können Sie nur mit Administratorrechten lesen; werden Sie also zunächst mit su (OpenSuse) oder sudo su (Ubuntu) zum Systemverwalter (wie in Teil 1 im Guru-Training der letzten Ausgabe beschrieben). Je nach Linux-Distribution finden Sie die wichtigsten Systemmeldungen in der Datei messages oder syslog im Log-Verzeichnis. Um nun etwa in die Datei messages einen Blick zu werfen, geben Sie den Befehl
less /var/log/messages
ein. Mit den Tasten [Bild hoch] und [Bild runter] können Sie bequem “seitenweise” durch die Datei springen. Der Begriff Seite bezieht sich hier auf die Menge an Text, die gleichzeitig ins Shellfenster passt. Um nur zeilenweise rauf und runter zu scrollen, verwenden Sie die Cursortasten. In der untersten Zeile des Fensters sehen Sie stets, welche Datei Sie gerade betrachten und an welcher Position Sie sich befinden (Abbildung 1). Lange Zeilen umbricht less “hart”: Anders als in einer Textverarbeitung erfolgt der Zeilenwechsel mitten im Wort und ohne die Anzeige von Trennstrichen oder ähnlichem – das Ziel ist, den Dateiinhalt möglichst unverändert darzustellen.

Abbildung 1: Das Tool “less” zeigt Textdateien an. Zeilenumbrüche mit Silbentrennung gibt es hier nicht.
Sie verlassen less, indem Sie [Q] (für “quit”) drücken; dann landen Sie wieder in der Shell.
Anfang und Ende
Oft ist gar nicht der gesamte Inhalt einer Datei interessant: Um sich einen Überblick über die Bedeutung einer Konfigurationsdatei zu verschaffen (zu welchem Programm gehört sie?), reichen die ersten paar Zeilen meist aus, denn dort stehen in der Regel erklärende Kommentare. Anders sieht es bei den Protokolldateien aus: Wenn sie nicht regelmäßig archiviert und durch leere Dateien ersetzt werden, können sie auf mehrere Megabyte Größe anwachsen. Relevante Informationen stehen dann aber nur in den letzten Zeilen.
Nun können Sie solche Dateien bequem in einem Programm wie less (siehe oben) anzeigen und dort jeweils nur den Anfang oder das Ende betrachten. Schneller ist aber oft ein gezielter Zugriff auf die ersten oder letzten paar Zeilen – das leisten die Tools head (deutsch: Kopf) und tail (Rest, Ende, Schwanz). Rufen Sie eines der beiden Kommandos mit einem Dateinamen als Argument auf, erscheinen die ersten oder letzten zehn Zeilen der Datei. Wollen Sie die Vorgabe von je zehn Zeilen ändern, schreiben Sie vor den Dateinamen noch ein Minuszeichen und direkt dahinter die Zahl, z. B. head -3 /etc/fstab. In gleicher Weise können Sie auch tail genauer anweisen: tail -3 /var/log/debug zeigt nur die letzten drei Zeilen an. Die Ausgaben dieser Befehlsbeispiele finden Sie im Kasten “head” und “tail”.
“head” und “tail”
esser@netbookhg:~$ head -3 /etc/fstab # /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> esser@netbookhg:~$ tail -3 /var/log/debug Feb 18 11:32:01 netbookhg kernel: [57565.132199] pci 0000:00:02.0: setting latency timer to 64 Feb 18 11:32:01 netbookhg kernel: [57565.134161] PM: Finishing wakeup. Feb 18 11:32:14 netbookhg kernel: [57577.712472] ra0: no IPv6 routers present
Nur Interessantes zeigen
Gerade Protokolldateien sind schnell mit einer riesigen Menge an Informationen gefüllt. Oft wollen Sie aber nur Zeilen sehen, in denen ein bestimmter Suchbegriff auftaucht. Für diese Aufgabe gibt es das Tool grep. Es erwartet zwei Argumente: das zu findende Wort und einen Dateinamen. Alle Zeilen der Datei /var/log/messages, die das Wort “ati_remote” enthalten, gibt etwa das Kommando
grep ati_remote /var/log/messages
aus. Sind Sie nicht sicher, ob das gesuchte Wort groß oder klein geschrieben wird, können Sie grep anweisen, solche Unterschiede zu ignorieren – dafür stellen Sie die Option -i voran (grep -i ati_remote /var/log/messages). Auf Wunsch hebt das Tool die Fundstellen noch farbig hervor (Abbildung 2), dazu ist die Option --color nötig. Mehr zu grep lesen Sie in einem älteren EasyLinux-Artikel [2].

Abbildung 2: Der Aufruf “grep –color begriff datei” zeigt nur die passenden Stellen und hebt darin noch die Treffer rot hervor.
Dateien suchen
Die Tools der Shell eignen sich auch prima zur Suche nach Dateien. Kennen Sie den Ablageort oder genauen Namen einer Datei nicht, hilft das Kommando find beim Durchforsten der Verzeichnisse. Ohne weitere Argumente aufgerufen, zeigt das Tool alle Dateien im aktuellen Arbeitsverzeichnis und in allen Unterverzeichnissen an. Da die Ausgabe lang werden kann, sollten Sie diese immer mit dem Betrachter less verknüpfen, also
find | less
eingeben. Das “Pipe” genannte Zeichen “|” erreichen Sie über [AltGr]+[<], und Sie nutzen damit einen Trick der Shell, der sich Ausgabeumleitung nennt: Sie geben die Ausgabe des find-Kommandos einfach an das Programm less weiter und betrachten so die gefundenen Dateinamen seitenweise. Der Trick funktioniert mit jedem Kommando, das Ausgaben direkt ins Shellfenster schreibt, also z. B. auch oben mit dem grep-Kommando – der letzte Beispielbefehl grep ati_remote /var/log/messages wird zu
grep ati_remote /var/log/messages | less
wenn Sie ihn mit less kombinieren.
Einfach nur alle Dateien aufzulisten, unterfordert find. Häufiger setzt man es dazu ein, Dateien zu finden, in deren Namen ein bestimmter Suchbegriff auftaucht, etwa die Dateiendung .pdf. Dafür nutzen Sie die Option -name. Außerdem können Sie vorgeben, dass das Tool in einem anderen als dem aktuellen Arbeitsverzeichnis sucht, etwa im Ordner /tmp, der die temporären Dateien enthält. Um (fast) alle PDF-Dateien in /tmp und dessen Unterverzeichnissen zu sehen, geben Sie
find /tmp -name '*.pdf'
ein:
esser@netbookhg:~$ find /tmp -name '*.pdf' /tmp/RG216468305.pdf /tmp/bs-ss2009-esser-prakt05.pdf /tmp/01_AB1_quadrat-fkt.pdf /tmp/bs-ss2009-esser-prakt10.pdf /tmp/083-088_oobasic2_hej.pdf /tmp/B-26651.pdf /tmp/RG242810868.pdf /tmp/easy/007-007_editorial.pdf /tmp/easy/004-006_inhalt.pdf […]
Wichtig ist, den Suchbegriff (hier: *.pdf) in einfache Anführungszeichen einzuschließen, die Sie über [Umschalt]+[#] eingeben können. Wenn Sie diese vergessen, arbeitet find eventuell nicht richtig.
Nun gibt es gelegentlich PDF-Dateien, die nicht die Endung .pdf haben, sondern auf .PDF in Großbuchstaben enden. Auch find können Sie dazu bewegen, über solche Kleinigkeiten hinwegzusehen – verwenden Sie statt -name die Option -iname (Namenssuche mit Ignorieren von Groß-/Kleinschreibung), dann findet der Befehl auch Dateien, die auf .PDF, .Pdf oder noch seltsamere Schreibweisen (etwa .pDf) enden.
Die Ergebnisse des find-Aufrufs können Sie nicht nur anzeigen, sondern auch damit arbeiten. Dazu nutzen Sie ein fortgeschrittenes Feature der Shell, über das Sie die Ausgabe eines Kommandos als Argument für ein anderes verwenden. Liefert beispielsweise der Suchbefehl find /tmp/ -name '*.pdf' als Ergebnisse /tmp/datei1.pdf und /tmp/datei2.pdf zurück und wollen Sie die gefundenen Dateien direkt im PDF-Viewer acroread betrachten, können Sie folgende Befehlszeile dafür verwenden:
acroread $( find /tmp/ -name '*.pdf' )
Die Shell verarbeitet das Kommando in zwei Schritten. Zunächst führt sie den find-Befehl aus und “merkt” sich das Ergebnis (nämlich: /tmp/datei1.pdf und /tmp/datei2.pdf in zwei separaten Zeilen). Daraus baut sie jetzt ein neues Kommando acroread /tmp/datei1.pdf /tmp/datei2.pdf zusammen und führt es aus, öffnet also im Adobe Reader die beiden PDF-Dateien. (Wenn Sie keinen Adobe Reader haben, ersetzen Sie acroread durch evince, xpdf oder den Namen eines anderen installierten PDF-Viewers.)
Das funktioniert allerdings nur dann, wenn die Namen der gefundenen Dateien keine Leerzeichen enthalten. Heißt eine Datei etwa Ich bin eine PDF-Datei.pdf, dann würde der Acrobat Reader beim selben Befehlsaufruf vergeblich versuchen, vier Dateien mit den Namen Ich, bin, eine und PDF-Datei.pdf zu öffnen. Der Kasten Dateinamen mit Leerzeichen zeigt, was in dieser Situation passiert; er enthält die Ausgabe eines ähnliches Befehls, der die gefundenen Namen nicht an acroread, sondern einfach an cat übergibt.
Dateinamen mit Leerzeichen
esser@netbookhg:~$ ls /tmp/*.pdf /tmp/Ich bin eine PDF-Datei.pdf esser@netbookhg:~$ cat $( find /tmp -name '*.pdf' ) cat: /tmp/Ich: Datei oder Verzeichnis nicht gefunden cat: bin: Datei oder Verzeichnis nicht gefunden cat: eine: Datei oder Verzeichnis nicht gefunden cat: PDF-Datei.pdf: Datei oder Verzeichnis nicht gefunden
Auch dieses Problem können Sie umgehen, die Lösung
find /tmp/ -name '*.pdf' -print0 | xargs -0 acroread
erklären wir aber erst in der nächsten Folge, weil sie nicht gerade intuitiv ist. Vereinfacht gesagt formatiert die zusätzliche find-Option -print0 die Ausgabe der Suchergebnisse ein wenig um, und das angehängte xargs -0 acroread sorgt dafür, dass der Acrobat Reader die Dateinamen in geeigneter Form als Argumente erhält; auch wenn darin Leerzeichen vorkommen.
Mehr zur Magie des letzten Beispielbefehls und Vorstellungen weiterer Standardtools für die Shell finden Sie im dritten Teil der Shell-Einführung in der kommenden Ausgabe.
Infos
[1] Shell-Einführung, Teil 1: Hans-Georg Eßer, “Im Anfang war der Prompt”, EasyLinux 01/2010, S. 124 ff., https://www.linux-community.de/artikel/20197
[2] Artikel zu “grep”: Heike Jurzik, “Schriftführer des Systems”, EasyLinux 05/2006, S. 90 f., http://www.easylinux.de/2006/05/090-guru/

