claim.gif
Linux Magazin Linux User Easy Linux Ubuntu User International Linux Community
Erschienen in EasyLinux 01/2007   »   Ausgabe bestellen

Ein- und Ausgabe umleiten und mit Pipes verknüpfen

Datenbaustelle

Heike Jurzik


Die Linux-Kommandozeile zeigt ihre Stärken gerade beim Kombinieren vieler kleiner Tools -- hier gilt der klassische Satz: Das Ganze ist mehr als die Summe seiner Teile. Umleitungen und Pipes sind oft mit am Werk, wenn Kommandos zusammenwirken.

Auf der Kommandozeile zu arbeiten, bedeutet mehr als nur Befehle einzugeben und ihre Ausgaben zu lesen: Scrollen die Informationen viel zu schnell über den Bildschirm, dann ist es gut zu wissen, wie Sie diese seitenweise anzeigen, darin blättern oder bestimmte Begriffe aufspüren. Für solche Aufgaben setzen Sie entweder Umleitungen oder Pipes ein -- beide beschreibt dieser Artikel.

Ebenso leicht speichern Sie die Ausgabe eines Programms in einer Datei -- das ist z. B. sinnvoll, wenn Sie Fehlermeldungen eines Programmes per Mail an einen Bekannten schicken wollen.

Drei Kanäle, aber kein TV

Für die Ein- und Ausgabe gibt es drei so genannte Kanäle, die von 0 bis 2 durchnummeriert werden:

Ausgabe umleiten

Wer die Ausgabe eines Befehls nicht am Bildschirm lesen, sondern in eine Datei umleiten möchte, verwendet den Operator >. Um beispielsweise den Inhalt des aktuellen Verzeichnisses aufzulisten und in der Datei inhalt.txt zu speichern, schreiben Sie

ls 1> inhalt.txt

Für die Standardausgabe dürfen Sie die Ziffer vor dem Umleitungszeichen weglassen, da der Operator > ohne weitere Angaben standardmäßig Kanal 1 verwendet:

ls > inhalt.txt

Beachten Sie, dass dieser Befehl die Datei neu anlegt, sofern sie noch nicht existiert, eine vorhandene Datei inhalt.txt aber überschreibt. Wer auf Nummer Sicher gehen will, überprüft entweder, ob es die Datei schon gibt oder verwendet statt > zwei Größerzeichen: Das Kommando

ls >> inhalt.txt

schreibt die Ausgabe des ls-Programms in die Datei inhalt.txt, sofern es diese noch nicht gibt; falls doch, hängt >> die Ausgabe ans Ende der Datei an.

Fehlermeldungen abfangen

Kanal 2 ist für die Fehlermeldungen reserviert. Verwenden Sie beispielsweise das Programm find [1], um das Dateisystem zu durchforsten, sehen Sie neben den Suchergebnissen oft auch Fehlermeldungen wie z. B.:

$ find /home/ -name "*.txt"
find: /home/petronella: Keine Berechtigung
/home/huhn/el/2005/09/musik_fuer_augen.txt
/home/huhn/el/2005/09/umleitungen.txt
...

Die Meldung Keine Berechtigung weist auf fehlende Leserechte für die jeweiligen Verzeichnisse hin und erscheint genau wie die Suchergebnisse, d. h. die Standardausgabe, auf dem Bildschirm. Wer die Fehler abfangen möchte, leitet die Standardfehlerausgabe (Kanal 2) entsprechend um. Hier hilft wieder der >-Operator: Diesem teilen Sie den Kanal über die vorangestellte "2" mit:

find /home/ -name "*.txt" 2> /dev/null

Die Fehlermeldungen des Programms landen nun nicht mehr zusammen mit den Suchergebnissen in der Konsole, sondern verschwinden sang- und klanglos im "Datengrab" /dev/null.

Tabelle 1: Gängige Umleitungen auf der Shell
KanalKommandoErgebnis
1 (stdout)befehl > dateiLeitet die Standardausgabe von befehl in datei.
1 (stdout)befehl >> dateiHängt die Standardausgabe von befehl an datei an.
2 (stderr)befehl 2> dateiLeitet die Standardfehlerausgabe von befehl in datei um.
2 (stderr)befehl 2>> dateiHängt die Standardfehlerausgabe von befehl an datei an.
1 (stdout) und 2 (stderr)befehl > datei 2>&1Leitet Standarda- und Standardfehlerausgabe von befehl zusammen in datei um.
1 (stdout) und 2 (stderr)befehl > datei1 2> datei2Standardausgabe von befehl landet in datei1, die Standardfehlerausgabe in datei2.
0 (stdin)befehl < dateiVerwendet den Inhalt von datei als Standardeingabe für befehl.

Gut kombiniert

Ebenso einfach ist es, zwei Kanäle gleichzeitig umzuleiten. Um die find-Ausgabe beispielsweise in die Datei find.txt und die Fehler nach fehler.txt zu schreiben, schreiben Sie:

find /home/ -name "*.txt" > find.txt 2> fehler.txt

Auch für dieses Beispiel gilt: Verdoppeln Sie die Umleitungszeichen, um bereits existierende Dateien nicht aus Versehen zu überschreiben, sondern die Ausgabe anzuhängen:

find /home/ -name "*.txt" >> find.txt 2>> fehler.txt

Wer hingegen beide Kanäle, stdout und stderr, in einer Datei ablegen möchte, koppelt die Ausgabe:

find /home/ -name "*.txt" > findaufruf.txt 2>&1

Eingabe umleiten

Die Standardeingabe erfolgt normalerweise über die Tastatur, kann aber über den Operator < auch aus einer Datei eingelesen werden. Wer die find-Ausgabe des letzten Listings gezielt nach Dateinamen durchsuchen möchte, nimmt am besten das Programm grep [2] zur Hilfe. Geben Sie nach dem Suchbegriff einfach über das Umleitungszeichen < an, wo grep durchforsten soll, nämlich in der Datei selbst:

$ grep 2006 < find.txt
/home/huhn/el/2006/02/debian02.txt
/home/huhn/el/2006/03/debian03.txt
/home/huhn/el/2006/03/guru_tar_zip.txt
...

Das Kommando sucht in der Datei find.txt nach dem Begriff 2006. Nötig ist die Umleitung hier nicht, da Sie grep einfach den Namen der Datei übergeben können, in dem das Tool suchen soll: grep easylinux findaufruf.txt funktioniert genauso gut.

Kanalsysteme mit Pipes

Die letzten Beispiele mit find und grep verkürzen Sie mit so genannten Pipes noch weiter: Machen Sie einfach die Standardausgabe eines Kommandos zur Standardeingabe des nächsten -- die Anzahl der Pipes ist unbegrenzt. Um das Rohrstück zwischen die beiden Programme zu bringen, benötigen Sie den senkrechten Strich |, den Sie auf deutschen PC-Tastaturen über [AltGr-<] erreichen. Wer also mit find im Verzeichnis /home Dateien, die auf ".txt" enden, suchen und vom Ergebnis nur die Zeilen sehen will, in denen die Zeichenkette "2006" vorkommt, verkettet beide Kommandos über eine Pipe, z. B. find /home/ -name "*.txt" | grep 2006. Eine hübsche Variante mit roten Hervorhebungen zeigt Abbildung 1: Die Option --color bringt die Farbe ins Spiel.

Abb. 1: Hier sind die Tools "find" und "grep" durch eine Pipe verbunden; für die Hervorhebung der Suchtreffer ist die "grep"-Option "--color" verantwortlich.

Besonders häufig benutzt man Pipes, um lange Programmausgaben von einem "Pager" seitenweise anzeigen zu lassen. Um etwa wie im Artikel [3] beschrieben, den Platzverbrauch im Home-Verzeichnis zu betrachten und zu sortieren, übergeben Sie zunächst die Ausgabe von du über eine Pipe an sort und leiten dessen Ausgabe noch an den Dateibetrachter less weiter:

$ du -sm /home/huhn/* | sort -rn | less
8470    /home/huhn/easylinux
2954    /home/huhn/digicam
1528    /home/huhn/tmp
...

Mit den Pfeiltasten blättern Sie hoch und runter, und mit [Q] beenden Sie less.

Und dazu bitte einen Tee

Was Sie durch eine Pipe geleitet haben, ist "weg", oder? Mit einem T-Stück, nämlich dem Programm tee, bauen Sie eine Abzweigung für den Datenstrom ein. Daten aus der Standardeingabe reicht das Tool unverändert an die Standardausgabe durch und schreibt sie zusätzlich in eine oder mehrere Dateien. Fügen Sie dazu das Verbindungsstück einfach mit einer Pipe ein, entweder ganz am Ende oder zwischen den beiden Kommandos:

befehl | tee datei | befehl2

Soll tee die Daten gleich in mehrere Dateien schreiben, hängen Sie hinter tee datei noch weitere Dateinamen an.

Um die sortierte du-Ausgabe aus dem vorherigen Beispiel nicht nur am Bildschirm zu betrachten, sondern parallel in eine Textdatei zu schreiben, benötigen Sie keine zwei Aufrufe -- statt

du -sm /home/huhn/* | sort -rn | less
du -sm /home/huhn/* | sort -rn > platzverbr.txt

schreiben Sie einfach

du -sm /home/huhn/* | sort -rn | tee platzverbr.txt | less

Standardmäßig überschreibt tee die Datei platzverbr.txt, falls es sie schon gibt. Das Tool hat aber eine Option -a, mit der Sie es dazu auffordern, Daten an eine schon existierende Datei anzuhängen:

du -sm /home/huhn/* | sort -rn | tee -a platzverbr.txt | less

Fazit

Mit Umleitungen und Pipes bauen Sie so manche Abkürzung in den Shell-Alltag ein und erhöhen den Komfort. Für weitere Experimente eignen sich auch die Hilfsprogramme head und tail, überraschende Effekte verursachen tac und rev: Bauen Sie die Programme doch probeweise in eine Pipe-Kette ein und lesen Sie die Manpages zu diesen Programmen. (hge)

Infos
[1] Artikel über find: Elisabeth Bauer, "Meisterdetektive", EasyLinux 01/2004, S. ff., http://www.easylinux.de/2004/01/072-find/
[2] Artikel zu grep: Elisabeth Bauer, "Textfischer -- Textdateien durchsuchen mit grep", EasyLinux 10/2003, S. 74 ff., http://www.easylinux.de/2003/10/074-grep/
[3] Artikel zu du, df und sort: Heike Jurzik, "Spürnasen", EasyLinux 09/2004, S. 84 ff., http://www.easylinux.de/2004/09/084-guru-df/

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.

Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2017 COMPUTEC MEDIA GmbH | Last modified: 2008-11-05 17:26

Nutzungsbasierte Onlinewerbung

[Linux-Magazin] [LinuxUser] [Linux-Community] [Admin-Magazin] [Ubuntu User] [Smart Developer] [Linux Events] [Linux Magazine] [Ubuntu User] [Admin Magazine] [Smart Developer] [Linux Magazine Poland] [Linux Community Poland] [Linux Magazine Brasil] [Linux Magazine Spain] [Linux Technical Review]