Umgang mit Programmausgaben

Block 1

3.1 Redirection  

Die meisten Programme die du in der Shell startest, schreiben auf den standard output (das heisst, sie schreiben in die Shell). Viele Programme akzeptieren auch Input vom standard input (das heisst, sie lesen direkt was du mit der Tastatur eintippst). Zudem gibt es noch standard error, wo Programme ihre Fehlermeldungen ausgeben. Auch das wird normalerweise im dem Terminal angezeigt.

Du hast bereits gesehen, wie du mit cat den Inhalt einer Datei im Terminal ausgeben kannst.

Tippe jetzt cat ohne eine Datei anzugeben.

cat

Tippe dann ein paar Worte ein und drücke anschliessend [Enter].

Drücke schliesslich [Ctrl]+[d] um die Eingabe zu beenden. (Solche Ctrl-Kombinationen werden oft mit ^ abgekürzt. Für [Ctrl]+[d] steht dann ^D.)

Was ist passiert?

Wenn du cat startest ohne eine Datei anzugeben, so liest cat vom standard input (der Tastatur) und schreibt auf den standard output (die Shell). Mit ^D sendest du das Signal für 'end of file' worauf cat beendet.

In Unix kannst du sowohl den input wie auch den output von Befehlen umleiten (redirect).

3.2 Den Output umleiten 

Mit dem > Zeichen kannst du den output eines Befehls umleiten. Um zum Beispiel eine Datei list1 zu erstellen, die eine Liste von Früchten enthält, tippe

cat > list1

Tippe dann die Namen einiger Früchte und drücke [Enter] nach jeder Frucht.

Birne Banane Apfel ^D ([Ctrl]+[d] um zu beenden.)

Wie vorher hat cat vom standard input (der Tastatur) gelesen. Den Output hast du aber mit > umgeleitet. Statt in die Shell, wird der Output nun in die Datei list1 geschrieben.

Um zusehen wie deine neue Datei aussieht, tippe

cat list1

Aufgabe 3a

Erstelle, mit der Methode von oben, eine weitere Datei list2 mit den folgenden Früchten: Orange, Pflaume, Mango, Pfirsich. Kontrolliere anschliessend den Inhalt von list2.

Mit >> kannst du standard output am Ende einer bestehenden Datei hinzufügen. Um also noch weitere Früchte zu list1 hinzuzufügen, tippe

cat >> list1

und anschliessend die Namen weiterer Früchte

Mango Traube Orange ^D ([Ctrl]+[d])

kontrolliere wieder den Inhalt

cat list1

Du hast nun zwei Dateien. Die eine mit 6, die andere mit 4 Früchten Wir werden diese nun mit Hilfe von cat zu einer Datei biglist verbinden. Tippe

cat list1 list2 > biglist

Dieser Befehl liest hintereinander den Inhalt von list1 und list2, und schreibt dann den Text in die Datei biglist

Um den Inhalt der neuen Datei anzuzeigen, tippe

cat biglist

3.3 Den Input umleiten 

Um den Input eines Befehls umzuleiten, verwendest du das < Zeichen.

Als Beispiel verwenden wir sort. Mit sort kannst du eine Liste alphabetisch oder numerisch sortieren. Tippe

sort

und gib dann die Namen einiger Gemüsesorten ein. Drücke [Enter] nach jeder.

Gurke Zucchetti Aubergine ^D ([Ctrl]+[d])

Der Output ist dann

Aubergine Gurke Zucchetti

Mit < kannst du nun den Input so umleiten, dass dieser aus einer Datei gelesen wird. Um also deine Liste mit Früchten zu sortieren, tippe

sort < biglist

Wie du siehst, erhältst du die Namen sortiert zurück.

Natürlich kannst du nun den Output auch gleich in eine Datei schreiben lassen, tippe

sort < biglist > slist

Verwende cat um den Inhalt von slist zu kontrollieren.

Hinweis: Wie die meisten Programme kannst du sort auch eine Datei als Argument übergeben. Der letzte Befehl macht das gleiche wie sort biglist > slist. Ausserdem könntest du auch cat und eine Pipe verwenden. Das gibt meist besser lesbare Befehlszeilen.

3.4 Pipes

Eine sehr nützliche Art um den Output eines Programms umzuleiten, ist eine Pipe.

Mit dem letzten Befehl haben wir eine alphabetische Liste von allen Früchten in unseren beiden Dateien list1 und list2 erstellt. Dafür hatten wir die beiden Listen zuerst in eine Datei kombiniert und diese Datei dann sortiert.

Das gleiche können wir auch direkt machen, indem wir den Output von cat direkt als Input an sort weiterleiten. Genau dafür sind Pipes. Das Zeichen für eine Pipe ist ein senkrechter Strich |. Der Befehl zu unserem Beispiel würde also so aussehen:

cat list1 list2 | sort

diese Art den Output eines Programms durch ein weiteres zu pipen ist sehr einfach und sehr mächtig. Du könntest nun auch den Output von sort wieder weiterleiten. Zum Beispiel um nur noch Früchte anzuzeigen, die den Buchstaben P enthalten:

cat list1 list2 | sort | grep -i 'p'

Aufgabe 3b

Wie viele Dateien oder Ordner in deinem home-Verzeichnis enthalten den Buchstaben 'd' im Dateinamen? Beantworte die Frage mit den bisher bekannten Befehlen und sinnvollem Einsatz von Pipes.

Lösung Anzeigen

ls ~ | grep -i 'd' | wc -l

Zusammenfassung

cat file Datei auf dem Standard Output ausgeben
cat > file Eingabe in Datei schreiben
cat file1 file2 > file0 file1 und file2 zu file0 kombinieren
command > file Standard Output in eine Datei umleiten
command >> file Standard Output am Ende einer Datei hinzufügen
command < file Standard Input aus einer Datei lesen
command1 | command2 Den Output von command1 in den Input von command2 umleiten (Pipe)
sort Daten sortieren