In diesem Kapitel lernen Sie fortgeschrittene Techniken kennen, die Ihre Arbeit im Terminal deutlich effizienter machen: Pipes, Ausgabeumleitungen, Wildcards und Textsuche.
Pipes: Programme verbinden¶
Mit Pipes (|) leiten Sie die Ausgabe eines Befehls als Eingabe an einen
anderen weiter:
$ befehl1 | befehl2Beispiel: Sortierte Dateiliste¶
$ ls -1
zebra.txt
alpha.txt
beta.txt
$ ls -1 | sort
alpha.txt
beta.txt
zebra.txtBeispiel: Anzahl der Dateien zählen¶
$ ls | wc -l
42wc -l (word count, lines) zählt die Zeilen der Eingabe.
Beispiel: Die größten Dateien finden¶
$ ls -lh | sort -k 5 -h | tail -n 5ls -lh: Detaillierte Liste mit lesbaren Größensort -k 5 -h: Sortiert nach Spalte 5 (Größe), human-readabletail -n 5: Zeigt die letzten 5 Zeilen (= größten Dateien)
Mehrere Pipes kombinieren¶
$ cat datei.txt | grep "Fehler" | sort | uniqcat datei.txt: Datei ausgebengrep "Fehler": Nur Zeilen mit “Fehler”sort: Sortierenuniq: Duplikate entfernen
Ausgabeumleitungen¶
> überschreibt die Zieldatei komplett!
>> hängt an die bestehende Datei an.
Ausgabe in Datei schreiben (>)¶
$ ls > dateiliste.txtStatt auf dem Bildschirm wird die Ausgabe in dateiliste.txt geschrieben.
$ echo "Hallo Welt" > hallo.txt
$ cat hallo.txt
Hallo WeltAn Datei anhängen (>>)¶
$ echo "Zeile 1" > datei.txt
$ echo "Zeile 2" >> datei.txt
$ cat datei.txt
Zeile 1
Zeile 2Eingabe aus Datei lesen (<)¶
$ sort < unsortiert.txtLiest unsortiert.txt und sortiert den Inhalt.
Ausgabe und Fehler trennen¶
$ befehl > ausgabe.txt 2> fehler.txt>oder1>: Normale Ausgabe (stdout)2>: Fehlerausgabe (stderr)
Beides in eine Datei:
$ befehl > alles.txt 2>&1Oder kürzer (seit bash 4.0):
$ befehl &> alles.txtAusgabe verwerfen¶
$ befehl > /dev/null/dev/null ist ein “schwarzes Loch” – alles, was dorthin geschrieben wird,
verschwindet.
Wildcards (Platzhalter)¶
Die Shell expandiert Wildcards automatisch vor der Befehlsausführung. Das nennt sich “Globbing”.
Wildcards ermöglichen es, mehrere Dateien auf einmal anzusprechen:
Stern (*)¶
Steht für beliebig viele Zeichen (auch null):
$ ls *.py
main.py test.py utils.py$ cp *.txt backup/Kopiert alle .txt-Dateien nach backup/.
$ rm test*Löscht alle Dateien, die mit “test” beginnen.
Fragezeichen (?)¶
Steht für genau ein Zeichen:
$ ls datei?.txt
datei1.txt datei2.txt datei3.txt$ ls datei??.txt
datei01.txt datei10.txt datei99.txtEckige Klammern ([])¶
Steht für ein Zeichen aus der angegebenen Menge:
$ ls datei[123].txt
datei1.txt datei2.txt datei3.txt$ ls datei[0-9].txt
datei0.txt datei1.txt ... datei9.txt$ ls [A-Z]*.py
Main.py Utils.pyGeschweifte Klammern ({})¶
Expandiert zu mehreren Varianten:
$ echo {apple,banana,cherry}.txt
apple.txt banana.txt cherry.txt$ mkdir -p projekt/{src,tests,docs}Erstellt drei Verzeichnisse.
$ cp script.py{,.backup}Äquivalent zu: cp script.py script.py.backup
Textsuche mit grep¶
grep ist eines der mächtigsten Unix-Werkzeuge. Es nutzt reguläre Ausdrücke
(Regular Expressions) für komplexe Suchmuster.
Mit grep suchen Sie nach Textmustern in Dateien:
Grundlegende Suche¶
$ grep "import" main.py
import sys
import csvZeigt alle Zeilen, die “import” enthalten.
In mehreren Dateien suchen¶
$ grep "def" *.py
main.py:def verarbeite(daten):
utils.py:def lese_csv(dateiname):
utils.py:def schreibe_csv(dateiname, daten):Groß-/Kleinschreibung ignorieren¶
$ grep -i "fehler" logfile.txtFindet “Fehler”, “fehler”, “FEHLER”, etc.
Zeilennummern anzeigen¶
$ grep -n "TODO" *.py
main.py:42:# TODO: Fehlerbehandlung verbessern
utils.py:15:# TODO: Dokumentation schreibenRekursiv in Verzeichnissen suchen¶
$ grep -r "class" src/Sucht in allen Dateien im src/-Verzeichnis.
Nur Dateinamen anzeigen¶
$ grep -l "import pandas" *.py
data_analysis.py
processing.pyInvertierte Suche¶
$ grep -v "^#" config.pyZeigt alle Zeilen, die nicht mit # beginnen (z.B. um Kommentare
auszublenden).
Mit regulären Ausdrücken¶
$ grep "^def " *.pyFindet Zeilen, die mit "def " beginnen (Funktionsdefinitionen).
$ grep "[0-9]{3,}" datei.txtFindet Zahlen mit mindestens 3 Ziffern.
Praktische Kombinationen¶
Python-Funktionen in einem Projekt finden¶
$ grep -rn "^def " src/ | head -10Zeigt die ersten 10 Funktionsdefinitionen mit Dateiname und Zeilennummer.
Log-Dateien nach Fehlern durchsuchen¶
$ grep -i "error" logfile.txt | tail -20Zeigt die letzten 20 Fehler.
Häufigste Wörter in einer Datei¶
$ cat datei.txt | tr ' ' '\n' | sort | uniq -c | sort -nr | head -10tr ' ' '\n': Ersetzt Leerzeichen durch Zeilenumbrüche (ein Wort pro Zeile)sort: Sortiertuniq -c: Zählt Duplikatesort -nr: Sortiert numerisch, absteigendhead -10: Top 10
Alle Python-Dateien finden und Zeilen zählen¶
$ find . -name "*.py" -exec wc -l {} + | sort -nfind . -name "*.py": Findet alle.py-Dateien-exec wc -l {} +: Zählt Zeilensort -n: Sortiert numerisch
Weitere nützliche Befehle¶
wc – Word Count¶
$ wc datei.txt
42 315 2048 datei.txtZeigt: Zeilen, Wörter, Bytes.
Nur Zeilen:
$ wc -l datei.txtsort – Sortieren¶
$ sort datei.txt
$ sort -r datei.txt # Rückwärts
$ sort -n zahlen.txt # Numerischuniq – Duplikate entfernen¶
$ sort datei.txt | uniq
$ sort datei.txt | uniq -c # Mit AnzahlWichtig: uniq funktioniert nur auf sortierten Daten!
cut – Spalten extrahieren¶
$ cut -d',' -f1,3 data.csvExtrahiert Spalten 1 und 3 aus einer CSV-Datei (Trennzeichen: Komma).
tr – Zeichen ersetzen¶
$ echo "HALLO" | tr 'A-Z' 'a-z'
hallo$ cat datei.txt | tr -d '\r'Entfernt Carriage Returns (Windows-Zeilenenden).
Gegeben ist eine Datei kurse.txt mit folgendem Inhalt:
Python Grundlagen
Git Workshop
Python Fortgeschritten
Unix Einführung
Python für BibliothekenFühren Sie folgende Aufgaben aus (erstellen Sie die Datei zuerst):
Zählen Sie die Zeilen in der Datei
Finden Sie alle Zeilen, die “Python” enthalten
Finden Sie alle Zeilen, die “Python” enthalten (case-insensitive)
Schreiben Sie alle Python-Kurse in eine neue Datei
python-kurse.txtSortieren Sie die Datei alphabetisch und zeigen Sie das Ergebnis
Zählen Sie, wie oft das Wort “Python” vorkommt
✅ Lösung
$ cat > kurse.txt << 'EOF'
Python Grundlagen
Git Workshop
Python Fortgeschritten
Unix Einführung
Python für Bibliotheken
EOF
$ wc -l kurse.txt
5 kurse.txt
$ grep "Python" kurse.txt
Python Grundlagen
Python Fortgeschritten
Python für Bibliotheken
$ grep -i "python" kurse.txt
Python Grundlagen
Python Fortgeschritten
Python für Bibliotheken
$ grep "Python" kurse.txt > python-kurse.txt
$ cat python-kurse.txt
Python Grundlagen
Python Fortgeschritten
Python für Bibliotheken
$ sort kurse.txt
Git Workshop
Python Fortgeschritten
Python Grundlagen
Python für Bibliotheken
Unix Einführung
$ grep -o "Python" kurse.txt | wc -l
3Alternative für Aufgabe 6:
$ grep -c "Python" kurse.txt
3Zusammenfassung¶
| Technik | Syntax | Beispiel |
|---|---|---|
| Pipe | cmd1 | cmd2 | ls | sort |
| Umleitung (schreiben) | > | echo "text" > datei.txt |
| Umleitung (anhängen) | >> | echo "mehr" >> datei.txt |
| Eingabe aus Datei | < | sort < datei.txt |
| Wildcards | *, ?, [] | ls *.py |
| Textsuche | grep | grep "import" *.py |
| Sortieren | sort | sort datei.txt |
| Duplikate entfernen | uniq | sort | uniq |
| Zeilen/Wörter zählen | wc | wc -l datei.txt |
Diese Werkzeuge machen die Unix-Kommandozeile so mächtig. Mit etwas Übung können Sie komplexe Datenverarbeitungen in einer einzigen Zeile durchführen!