Textwerkzeuge
Alles ist Text
Abschnitt betitelt „Alles ist Text“Konfiguration, Logdateien, Benutzerlisten, Prozesslisten: Unter Linux ist fast alles eine Textdatei oder eine Textausgabe mit einer Zeile pro Eintrag. Dazu passt ein Werkzeugkasten aus kleinen Programmen, die je eine Sache tun und über Pipes zusammenarbeiten. Man nennt sie Filter: Sie lesen Text von stdin oder aus Dateien und schreiben das Resultat nach stdout.
Als Übungsmaterial dient auf dieser Seite vor allem /etc/passwd, eine Zeile pro Benutzer, sieben Felder, getrennt durch Doppelpunkte:
root:x:0:0:root:/root:/bin/bashwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologinAnzeigen und zählen
Abschnitt betitelt „Anzeigen und zählen“| Befehl | Zweck | Wichtige Optionen |
|---|---|---|
cat |
ganze Datei ausgeben, Dateien aneinanderhängen | -n Zeilennummern |
less |
seitenweise lesen, blättern mit Leertaste, suchen mit /, beenden mit q |
-N Zeilennummern |
head |
die ersten Zeilen | -n 5 fünf Zeilen |
tail |
die letzten Zeilen | -n 5, -f folgt einer wachsenden Datei |
wc |
zählen | -l Zeilen, -w Wörter, -c Bytes |
Hands-on:
head -n 3 /etc/passwdtail -n 2 /etc/passwdhead -n 8 /etc/passwd | tail -n 2wc -l /etc/passwdsudo tail -f /var/log/syslogtail -f ist der Befehl für Logdateien: Es zeigt das Ende und wartet auf neue Zeilen. Beenden mit Ctrl+C. Die dritte Zeile zeigt, wie du einen Ausschnitt (Zeile 7 und 8) herausschneidest.
grep: Zeilen finden
Abschnitt betitelt „grep: Zeilen finden“grep muster datei gibt alle Zeilen aus, die auf das Muster passen.
| Option | Wirkung |
|---|---|
-i |
Gross- und Kleinschreibung ignorieren |
-n |
Zeilennummer mitausgeben |
-v |
umkehren: nur Zeilen, die nicht passen |
-c |
nur zählen |
-w |
nur ganze Wörter |
-r |
rekursiv durch ein Verzeichnis |
-E |
erweiterte reguläre Ausdrücke (+, ` |
Das Muster ist ein regulärer Ausdruck. Die wichtigsten Zeichen:
| Zeichen | Bedeutung |
|---|---|
^ |
Zeilenanfang |
$ |
Zeilenende |
. |
ein beliebiges Zeichen |
* |
das vorherige Zeichen null- oder mehrmals |
+ |
das vorherige Zeichen ein- oder mehrmals (nur mit -E) |
[abc], [0-9] |
ein Zeichen aus der Menge |
Achtung, * bedeutet hier etwas anderes als beim Glob: a* passt auf «kein a, ein a, viele a». «Beliebiger Text» heisst in Regex .*. Setze Muster immer in einfache Anführungszeichen, damit die Shell nicht selbst an *, $ oder | herumbastelt.
Hands-on:
grep bash /etc/passwdgrep -c nologin /etc/passwdgrep -v nologin /etc/passwdgrep -n '^root' /etc/passwdgrep 'bash$' /etc/passwdgrep -i 'DAEMON' /etc/passwdgrep -E '^(root|sync):' /etc/passwdgrep -rn 'PermitRootLogin' /etc/ssh/grep -w 'sh' /etc/passwdVergleiche die letzte Zeile mit grep sh /etc/passwd. -w findet nur das Wort sh, nicht bash oder ssh.
cut, sort, uniq, tr: Spalten und Zeilen bearbeiten
Abschnitt betitelt „cut, sort, uniq, tr: Spalten und Zeilen bearbeiten“| Befehl | Zweck | Wichtige Optionen |
|---|---|---|
cut |
Spalten herausschneiden | -d: Trennzeichen, -f1,7 Felder 1 und 7, -c1-5 Zeichen 1 bis 5 |
sort |
Zeilen sortieren | -n numerisch, -r rückwärts, -k3 nach Spalte 3, -t: Trennzeichen, -u doppelte entfernen |
uniq |
benachbarte doppelte Zeilen zusammenfassen | -c mit Anzahl |
tr |
Zeichen ersetzen oder löschen | 'a-z' 'A-Z', -d löschen, -s wiederholte zusammenfassen |
Hands-on:
cut -d: -f1 /etc/passwdcut -d: -f1,7 /etc/passwd | head -n 5sort -t: -k3 -n /etc/passwd | tail -n 3cut -d: -f7 /etc/passwd | sort | uniq -ccut -d: -f7 /etc/passwd | sort | uniq -c | sort -rnecho "$PATH" | tr ':' '\n'echo "hallo welt" | tr 'a-z' 'A-Z'Die vierte Zeile ist das wichtigste Muster dieser Seite: sort | uniq -c zählt, wie oft jeder Wert vorkommt. uniq erkennt nur benachbarte Duplikate, darum muss sort davor stehen. Die fünfte Zeile sortiert dann noch nach Häufigkeit.
sed: suchen und ersetzen
Abschnitt betitelt „sed: suchen und ersetzen“sed ist ein Stream-Editor. Du brauchst davon vor allem einen Befehl, s/alt/neu/:
echo "Hallo Welt" | sed 's/Welt/Linux/'sed 's/:x:/:PASSWORT:/' /etc/passwd | head -n 3sed -n '1,3p' /etc/passwdsed -n '/bash$/p' /etc/passwdcut -d: -f7 /etc/passwd | sed 's#/usr/sbin/nologin#kein Login#'s/alt/neu/ ersetzt pro Zeile das erste Vorkommen, mit s/alt/neu/g alle. -n zusammen mit p gibt nur die ausgewählten Zeilen aus, in der dritten Zeile die Zeilen 1 bis 3, in der vierten die Zeilen mit Treffer. Das Trennzeichen muss kein / sein; enthält das Muster Pfade, nimmst du # und sparst dir das Maskieren.
awk: Spalten mit Logik
Abschnitt betitelt „awk: Spalten mit Logik“awk ist eine ganze Programmiersprache. Hier reicht eine Verwendung: Spalten ausgeben, egal wie viele Leerzeichen oder Tabs dazwischen stehen. Die Felder heissen $1, $2 und so weiter, $NF ist das letzte.
ls -l /etc | awk '{print $9}'ls -l /etc | awk '{print $5, $9}' | sort -n | tail -n 3awk -F: '{print $1}' /etc/passwdawk -F: '{print $1 " nutzt " $7}' /etc/passwd | head -n 3awk -F: '$7 == "/bin/bash" {print $1}' /etc/passwd-F: setzt den Feldtrenner, die letzte Zeile zeigt eine Bedingung vor dem Block: Nur Zeilen, deren siebtes Feld /bin/bash ist. Das awk-Programm steht immer in einfachen Anführungszeichen, damit die Shell $1 nicht selbst ersetzt.
cut oder awk? cut ist einfacher, wenn der Trenner ein einzelnes Zeichen ist. awk gewinnt bei Leerzeichen in variabler Zahl, etwa bei der Ausgabe von ls -l, ps oder df.
date: Zeit formatieren
Abschnitt betitelt „date: Zeit formatieren“date zeigt Datum und Zeit, und mit einem Format-String nach + bestimmst du die Darstellung. Die %-Platzhalter tauchen in ähnlicher Form in fast jeder Programmiersprache wieder auf.
| Format | Ausgabe | Bedeutung |
|---|---|---|
%d %m %Y |
05 11 2026 |
Tag, Monat, Jahr vierstellig |
%y |
26 |
Jahr zweistellig |
%H %M %S |
19 03 58 |
Stunde (0 bis 23), Minute, Sekunde |
%T |
19:03:58 |
Kurzform für %H:%M:%S |
%F |
2026-11-05 |
Kurzform für %Y-%m-%d, sortierbar |
%A %B |
Donnerstag November |
Wochentag und Monat ausgeschrieben, sprachabhängig |
%a %b |
Do Nov |
abgekürzt |
%s |
1793.. |
Sekunden seit 1.1.1970, der Unix-Timestamp |
%n |
Zeilenumbruch |
Hands-on:
datedate +%Fdate "+%d.%m.%Y %H:%M"date "+%A, den %d. %B %Y"date "+Es ist %T Uhr"date +%sdate -d "2 weeks ago" +%Fdate -d "next monday"date -d "@1700000000"-d rechnet mit Datumsangaben, auch in Alltagssprache. Praktisch für Backups: tar czf "backup-$(date +%F).tar.gz" ~/projekt erzeugt einen Dateinamen mit dem heutigen Datum, der sich alphabetisch richtig sortiert.
diff: Unterschiede sehen
Abschnitt betitelt „diff: Unterschiede sehen“cp /etc/hosts /tmp/hostsecho "10.0.0.5 testserver" >> /tmp/hostsdiff /etc/hosts /tmp/hostsdiff -u /etc/hosts /tmp/hostsdiff -u ist das Format, das du aus git diff kennst: - für entfernte, + für hinzugefügte Zeilen. Ohne Ausgabe sind die Dateien identisch.
Klassische Pipelines
Abschnitt betitelt „Klassische Pipelines“Jetzt setzt du die Filter zusammen. Jede Pipeline löst eine konkrete Frage:
Welche Befehle benutze ich am häufigsten?
history | awk '{print $2}' | sort | uniq -c | sort -rn | headhistory gibt Nummer und Befehl, darum $2. Dann das Zählmuster und die Top 10.
Welche Benutzer haben eine Bash als Login-Shell?
grep '/bin/bash$' /etc/passwd | cut -d: -f1Welche Shells sind wie oft im Einsatz?
cut -d: -f7 /etc/passwd | sort | uniq -c | sort -rnDie fünf grössten Dateien in /var/log?
sudo find /var/log -type f -printf '%s %p\n' | sort -rn | head -n 5Welche IP-Adressen tauchen in einem Log am häufigsten auf?
sudo grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/auth.log | sort | uniq -c | sort -rn | head-o gibt nur den Treffer aus statt der ganzen Zeile. Das Muster beschreibt vier Zahlengruppen mit Punkten dazwischen. Auf einem Server mit SSH-Zugang aus dem Internet ist das eine ernüchternde Liste. Fehlt /var/log/auth.log auf deiner VM (ohne rsyslog schreibt Ubuntu nur ins Journal), nimm journalctl -u ssh --no-pager als ersten Befehl der Pipeline, dasselbe gilt für tail -f /var/log/syslog weiter oben (journalctl -f).
Lösung anzeigen
#!/bin/bash## pipelines.sh - fünf Beispiel-Pipelines zu Modul 7
echo "== 1. Häufigste Befehle =="grep -v '^#' ~/.bash_history | awk '{print $1}' | sort | uniq -c | sort -rn | head
echo "== 2. Benutzer mit UID ab 1000 =="awk -F: '$3 >= 1000 {print $1}' /etc/passwd | sort
echo "== 3. Dateiendungen in /etc =="find /etc -maxdepth 1 -type f | grep '\.' | sed 's/.*\.//' | sort | uniq -c | sort -rn
echo "== 4. Grösste Verzeichnisse unter /usr =="du -s /usr/* 2>/dev/null | sort -rn | head -n 3
echo "== 5. Zeitstempel =="echo "Dieses Skript lief am $(date +%d.%m.%Y) um $(date +%H:%M)"Selbstcheck · 6 Fragen
Weiterführend
Abschnitt betitelt „Weiterführend“man grep,man sed,man awk,man date, jeweils mit Beispielen am Ende- GNU Coreutils Handbuch
- ubuntuusers Wiki: Shell/Textverarbeitung