Zum Inhalt springen

Pipes

Eine Pipe (|) verbindet den stdout eines Befehls direkt mit dem stdin des nächsten – ohne eine temporäre Datei. Die beiden Programme laufen dabei gleichzeitig; der erste produziert Daten, der zweite verarbeitet sie sofort.

Terminal-Fenster
befehl1 | befehl2
Terminal-Fenster
ls /etc | sort -r # Verzeichnisinhalt umgekehrt sortieren
cat /etc/passwd | wc -l # Anzahl Zeilen in /etc/passwd zählen
echo "hallo welt" | tr 'a-z' 'A-Z' # in Großbuchstaben umwandeln

Mehrere Pipes lassen sich zu einer Pipeline verketten. Die Daten fließen von links nach rechts durch jeden Befehl:

Terminal-Fenster
cat /etc/passwd | cut -d: -f1 | sort | head -5
# → erste 5 Benutzernamen alphabetisch sortiert

Schritt für Schritt:

  1. cat /etc/passwd – gibt die Datei aus
  2. cut -d: -f1 – schneidet das erste :-getrennte Feld heraus (Benutzername)
  3. sort – sortiert alphabetisch
  4. head -5 – zeigt nur die ersten 5 Zeilen
Terminal-Fenster
ls -lh /var/log/*.log | sort -k5 -h | tail -5
# → die 5 größten Log-Dateien nach Größe sortiert

Die Pipe verbindet nur stdout – stderr fließt weiterhin direkt auf das Terminal:

Terminal-Fenster
ls /etc /nichtvorhanden | wc -l
# ls: cannot access '/nichtvorhanden': No such file or directory ← stderr aufs Terminal
# 212 ← stdout durch Pipe an wc

Sollen auch Fehlermeldungen durch die Pipe fließen:

Terminal-Fenster
ls /etc /nichtvorhanden 2>&1 | grep "No such"
# ls: cannot access '/nichtvorhanden': No such file or directory
Umleitung: befehl > datei.txt
┌─────────┐ stdout ┌───────────┐
│ befehl │ ─────────►│ datei.txt │
└─────────┘ └───────────┘
Pipe: befehl1 | befehl2
┌──────────┐ stdout stdin ┌──────────┐
│ befehl1 │ ─────────────────►│ befehl2 │
└──────────┘ └──────────┘