awk und sed sind mächtige Tools für Textverarbeitung auf der Kommandozeile. Sie ermöglichen komplexe Transformationen und Analysen von Textdaten.
sed - Stream Editor
Grundsyntax
sed 'befehl' datei
sed -i 'befehl' datei # In-place (Datei ändern)Suchen und Ersetzen
# Erstes Vorkommen pro Zeile
sed 's/alt/neu/' datei
# Alle Vorkommen
sed 's/alt/neu/g' datei
# Case-insensitive
sed 's/alt/neu/gi' datei
# Nur N-tes Vorkommen
sed 's/alt/neu/2' dateiIn-Place bearbeiten
# Datei direkt ändern
sed -i 's/alt/neu/g' datei
# Mit Backup
sed -i.bak 's/alt/neu/g' dateiZeilen bearbeiten
# Zeile löschen
sed '5d' datei # Zeile 5
sed '5,10d' datei # Zeilen 5-10
sed '/muster/d' datei # Zeilen mit Muster
sed '/^#/d' datei # Kommentare
# Zeile einfügen
sed '5i\Neue Zeile' datei # Vor Zeile 5
sed '5a\Neue Zeile' datei # Nach Zeile 5
# Zeile ersetzen
sed '5c\Neue Zeile' datei # Zeile 5 ersetzen# Nur bestimmte Zeilen
sed -n '5p' datei # Zeile 5
sed -n '5,10p' datei # Zeilen 5-10
sed -n '/muster/p' datei # Zeilen mit MusterRegex
# Wortgrenzen
sed 's/\bwort\b/ersatz/g' datei
# Gruppen
sed 's/\(.*\):\(.*\)/\2:\1/' datei # Tauschen
# Erweiterte Regex
sed -E 's/[0-9]+/NUMBER/g' dateiMehrzeilig
# Zeilen zusammenfügen
sed 'N;s/\n/ /' datei
# Mehrere Befehle
sed -e 's/alt/neu/' -e 's/foo/bar/' datei
sed 's/alt/neu/; s/foo/bar/' dateiawk - Pattern-Scanning
Grundsyntax
awk 'muster { aktion }' datei
awk -F: '{ print $1 }' datei # FeldtrennerFelder
# Bestimmte Spalten
awk '{ print $1 }' datei # Erste Spalte
awk '{ print $1, $3 }' datei # Spalte 1 und 3
awk '{ print $NF }' datei # Letzte Spalte
awk '{ print $(NF-1) }' datei # Vorletzte
# Mit Feldtrenner
awk -F: '{ print $1 }' /etc/passwd
awk -F',' '{ print $2 }' data.csvEingebaute Variablen
| Variable | Bedeutung | |----------|-----------| | $0 | Gesamte Zeile | | $1, $2... | Feld 1, 2... | | NF | Anzahl Felder | | NR | Zeilennummer | | FS | Feldtrenner | | OFS | Output Feldtrenner | | RS | Record Separator |
Pattern-Matching
# Zeilen mit Muster
awk '/error/' datei
# Zeilen ohne Muster
awk '!/error/' datei
# Feld enthält Muster
awk '$3 ~ /error/' datei
# Numerischer Vergleich
awk '$3 > 100' datei
awk '$3 > 100 && $4 < 50' dateiBerechnungen
# Summe einer Spalte
awk '{ sum += $1 } END { print sum }' datei
# Durchschnitt
awk '{ sum += $1; count++ } END { print sum/count }' datei
# Maximum
awk 'BEGIN { max = 0 } $1 > max { max = $1 } END { print max }' dateiFormatierte Ausgabe
# printf
awk '{ printf "%-10s %5d\n", $1, $2 }' datei
# Spalten formatieren
awk '{ printf "%s,%s,%s\n", $1, $2, $3 }' dateiBEGIN und END
awk 'BEGIN { print "Start" } { print $0 } END { print "Ende" }' datei
# Header hinzufügen
awk 'BEGIN { print "Name,Size" } { print $1 "," $2 }' dateiBedingungen und Schleifen
# If-else
awk '{ if ($1 > 100) print "groß"; else print "klein" }' datei
# For-Schleife
awk '{ for (i=1; i<=NF; i++) print $i }' datei
# While
awk '{ i=1; while (i<=NF) { print $i; i++ } }' dateiArrays
# Zählen
awk '{ count[$1]++ } END { for (k in count) print k, count[k] }' datei
# Beispiel: IP-Adressen zählen
awk '{ ip[$1]++ } END { for (i in ip) print ip[i], i }' access.log | sort -rnPraktische Beispiele
Log-Analyse
# Fehlermeldungen extrahieren
grep ERROR app.log | awk '{ print $NF }'
# Requests pro IP
awk '{ print $1 }' access.log | sort | uniq -c | sort -rn | head -20
# Durchschnittliche Response-Zeit
awk '{ sum += $NF; count++ } END { print sum/count }' access.logConfig-Dateien
# Kommentare entfernen
sed '/^#/d; /^$/d' config.conf
# Key-Value extrahieren
awk -F= '/^[^#]/ { print $1, $2 }' config.conf
# Wert ändern
sed -i 's/^MaxConnections=.*/MaxConnections=1000/' config.confCSV-Verarbeitung
# Spalte extrahieren
awk -F, '{ print $2 }' data.csv
# Header überspringen
awk -F, 'NR>1 { print $2 }' data.csv
# Summe einer Spalte
awk -F, 'NR>1 { sum += $3 } END { print sum }' data.csv
# Spalten neu ordnen
awk -F, '{ print $3 "," $1 "," $2 }' data.csvPasswd-Datei
# User-Liste
awk -F: '{ print $1 }' /etc/passwd
# User mit UID > 1000
awk -F: '$3 > 1000 { print $1 }' /etc/passwd
# User und Home
awk -F: '{ print $1, $6 }' /etc/passwdNetzwerk-Statistiken
# Offene Ports zählen
ss -tunap | awk 'NR>1 { print $1 }' | sort | uniq -c
# Verbindungen pro IP
ss -tn | awk 'NR>1 { print $5 }' | cut -d: -f1 | sort | uniq -c | sort -rnDatenbank-Dump
# Tabellennamen
grep "CREATE TABLE" dump.sql | sed 's/.*`\(.*\)`.*/\1/'
# Bestimmte Tabelle extrahieren
sed -n '/CREATE TABLE `users`/,/^--$/p' dump.sqlKombinationen
# sed und awk zusammen
cat datei | sed 's/,/ /g' | awk '{ print $1, $NF }'
# Mit grep
grep pattern datei | awk '{ print $2 }' | sort | uniq
# Pipeline
ps aux | awk '$3 > 10 { print $2, $3, $11 }' | sort -k2 -rn | head -10Zusammenfassung
| sed | Funktion | |-----|----------| | s/alt/neu/g | Ersetzen | | /muster/d | Zeilen löschen | | -n '/muster/p' | Zeilen drucken | | -i | In-place |
| awk | Funktion | |-----|----------| | { print $1 } | Spalte drucken | | -F: | Feldtrenner | | /muster/ | Pattern-Match | | NR, NF | Zeilen/Felder-Anzahl | | BEGIN/END | Vor/Nach Verarbeitung |
| Aufgabe | Tool | |---------|------| | Suchen/Ersetzen | sed | | Spalten extrahieren | awk | | Zeilen filtern | beide | | Berechnungen | awk | | In-place Änderung | sed -i |
Fazit
sed und awk sind essentiell für Textverarbeitung unter Linux. sed eignet sich für einfache Transformationen und In-place-Bearbeitung. awk ist mächtiger für spaltenbasierte Daten und Berechnungen. Die Kombination beider Tools löst die meisten Textverarbeitungsaufgaben. Für komplexere Anforderungen können Python oder Perl besser geeignet sein.