sed · awk · perl · Textverarbeitung · Shell
sed, awk und perl
wann welches Werkzeug für Textverarbeitung richtig ist

sed, awk und perl lösen alle drei Textverarbeitungsaufgaben in der Shell — aber mit unterschiedlichen Stärken, Grenzen und Performance-Charakteristika. sed für zeilenweise Substitution, awk für strukturierte Feldverarbeitung, perl für komplexe Logik, Multiline-Muster und Unicode: die richtige Wahl spart Zeit und vermeidet fragile Lösungen.

13 Min. Lesezeit sed · awk · perl · Multiline · In-Place-Editing · Performance GNU · POSIX · Linux · macOS

1. Die Entscheidungsfrage: sed, awk oder perl?

Die Wahl zwischen sed, awk und perl ist keine Frage des persönlichen Geschmacks, sondern eine technische Entscheidung basierend auf dem Eingabeformat, der gewünschten Transformation und den Anforderungen an Portabilität und Wartbarkeit. Alle drei Werkzeuge lesen Eingabe zeilenweise, transformieren sie und geben die Ergebnisse aus — aber die mentalen Modelle sind fundamental verschieden. sed verarbeitet einzelne Textzeilen mit einem kleinen Satz von Befehlen. awk sieht Eingabe als Tabelle aus Zeilen und Feldern. perl ist eine vollständige Programmiersprache mit regulären Ausdrücken als First-Class-Citizen.

Die Faustregel beim Einsatz von sed, awk und perl in Shell-Skripten: sed für einfache, zeilenweise Substitutionen und Löschungen. awk, wenn die Eingabe Felder hat und man Werte extrahieren, berechnen oder aggregieren muss. perl, wenn man Multiline-Muster, Unicode, komplexe Datenstrukturen oder Logik jenseits von sed und awk braucht. Das Ziel ist immer Lesbarkeit und Wartbarkeit — ein 80-Zeichen-perl-Einzeiler, den kein Teamkollege in einem Jahr versteht, ist schlechter als drei verständliche awk-Zeilen.

Ein wichtiger praktischer Aspekt: Auf macOS ist sed die BSD-Variante, auf Linux die GNU-Variante — mit erheblichen Unterschieden bei -i, erweiterten regulären Ausdrücken und verfügbaren Befehlen. sed, awk und perl-Skripte, die in CI/CD auf Linux laufen sollen und lokal auf macOS entwickelt werden, müssen portabel geschrieben oder mit gsed / gawk via Homebrew explizit auf GNU-Versionen festgelegt werden. perl ist deutlich portabler — die Sprachsemantik ist konsistent über Plattformen.

2. sed: Stärken, Grenzen und typische Anwendungsfälle

sed (Stream Editor) ist optimiert für zeilenweise Transformationen mit regulären Ausdrücken. Die häufigsten Anwendungsfälle: Ersetzen von Zeichenketten (s/alt/neu/g), Löschen von Zeilen (/muster/d), Ausgabe spezifischer Zeilenbereiche (10,20p) und Einfügen von Text vor oder nach einem Muster. sed ist schnell, universell verfügbar und für einfache Substitutionen oft die kompakteste Lösung. Im Vergleich zu sed, awk und perl ist sed am schmalsten in seinem Funktionsumfang — das ist gleichzeitig seine Stärke für einfache Aufgaben.

Die Grenzen von sed zeigen sich bei mehrzeiligen Mustern, komplexer Logik und wenn Felder unterschiedlich verarbeitet werden sollen. sed kennt keine Variablen im üblichen Sinne, keinen numerischen Vergleich und keine Schleifen außer dem impliziten Zeilen-für-Zeilen-Zyklus. Das Hold-Space-Feature erlaubt zwar das Zwischenspeichern von Zeilen, ist aber für alle außer sed-Experten schwer lesbar. Die Empfehlung beim Einsatz von sed, awk und perl: Wenn das sed-Kommando mehr als eine Pipe oder mehr als 50 Zeichen lang wird und Bedingungen enthält, awk oder perl ist die bessere Wahl.


#!/usr/bin/env bash
# sed-examples.sh — Practical sed patterns for shell scripts
set -euo pipefail

# Simple substitution: replace all occurrences
sed 's/old_hostname/new_hostname/g' /etc/hosts

# Delete comment lines and blank lines (common for config cleanup)
sed '/^[[:space:]]*#/d; /^[[:space:]]*$/d' config.ini

# Extract lines 10–20 and quit (faster than tail/head combination)
sed -n '10,20p' largefile.log

# Add prefix to every line (useful for log formatting)
sed 's/^/[PREFIX] /' application.log

# In-place substitution with GNU sed (requires -i '' on BSD/macOS)
# Cross-platform safe: use perl -i instead (see section 5)
sed -i 's/APP_VERSION=.*/APP_VERSION=2.5.0/' .env

# Conditional: only replace on lines matching a pattern
sed '/^HOST/s/localhost/10.0.0.1/' config.conf

# Delete from pattern to end of file
sed '/^# BEGIN GENERATED/,$d' template.conf

3. awk: Feldverarbeitung, Aggregation und Berichte

awk denkt in Zeilen und Feldern. Jede Eingabezeile wird automatisch in Felder aufgeteilt ($1, $2 usw. basierend auf dem Trennzeichen FS), und awk-Programme bestehen aus Muster-Aktion-Paaren: Muster { Aktion }. Das macht awk zur idealen Wahl für alle strukturierten Texte — CSV, TSV, Log-Formate, Ausgaben von CLI-Tools. Im Trio sed, awk und perl ist awk das Werkzeug, wenn man Werte aus bestimmten Feldern extrahieren, summieren, zählen oder umformatieren muss.

Besonderheiten von awk, die oft nicht bekannt sind: Das spezielle Muster BEGIN läuft vor der ersten Eingabezeile, END nach der letzten — ideal für Initialisierung und Ausgabe von Aggregaten. Die Variable NR ist die aktuelle Zeilennummer, NF die Anzahl der Felder in der aktuellen Zeile. Assoziative Arrays werden in awk nativ unterstützt: count[$1]++ zählt Vorkommnisse des ersten Feldes. Für Aggregationen, die in sed nicht möglich wären und für die perl überdimensioniert ist, ist awk bei sed, awk und perl die optimale Wahl.


#!/usr/bin/env bash
# awk-examples.sh — Practical awk patterns for log analysis and reporting
set -euo pipefail

# Extract specific fields from access log (field 1=IP, field 7=URL, field 9=status)
awk '{print $1, $9, $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# Sum file sizes: ls -l output, field 5 is size
ls -l /var/log/*.log | awk '{sum += $5} END {printf "Total: %.2f MB\n", sum/1024/1024}'

# Count HTTP status codes from nginx log
awk '{codes[$9]++} END {for (c in codes) printf "%s: %d\n", c, codes[c]}' \
  /var/log/nginx/access.log | sort -t: -k2 -rn

# Process CSV: skip header, filter by third column value > 100
awk -F',' 'NR > 1 && $3 > 100 {print $1, $2, $3}' data.csv

# Multi-file report: print filename and line count
awk 'FNR == 1 {print FILENAME} END {print NR " total lines"}' *.log

# Reformat: transform "key=value" lines to JSON key-value pairs
awk -F'=' '{printf "  \"%s\": \"%s\",\n", $1, $2}' config.env

4. perl: Multiline, Unicode und komplexe Transformationen

perl ist im Vergleich zu sed und awk keine spezialisierte Textverarbeitungs-Sprache, sondern eine vollständige Programmiersprache mit besonders ausdrucksstarken regulären Ausdrücken. Das macht perl zur richtigen Wahl, wenn sed oder awk an ihre Grenzen stoßen: Multiline-Muster über Zeilengrenzen hinweg, Unicode-bewusste Transformationen, komplexe Bedingungslogik mit mehreren Transformationsschritten oder Dateitransformationen, die Rückwärtsreferenzen, Look-Ahead und Look-Behind brauchen. Im Trio sed, awk und perl ist perl die Eskalationsstufe für komplexe Aufgaben.

Die perl-Einzeiler-Syntax spiegelt sed und awk: perl -ne (nur Ausgabe mit explizitem print), perl -pe (automatisches Ausgeben wie sed), perl -i für In-Place-Editing. Der Modifier /s macht . zu einem universellen Zeichen inklusive Newline — die Grundlage für Multiline-Muster. Wichtig beim Einsatz von sed, awk und perl: perl ist auf jedem Linux-Server und macOS vorinstalliert, aber die Version kann stark variieren. Moderne Perl-Features ab 5.10 (z.B. // defined-or-Operator, Named Captures) sind seit über einem Jahrzehnt verfügbar und können in Shell-Skripten verwendet werden.

5. In-Place-Editing: sed -i vs. perl -i — Fallstricke

In-Place-Editing ist eine der häufigsten Quellen von Portabilitätsproblemen beim Einsatz von sed, awk und perl in Shell-Skripten, die auf verschiedenen Plattformen laufen sollen. GNU sed (sed -i 's/alt/neu/g' datei) ändert Dateien direkt. BSD sed (macOS) erfordert ein Backup-Suffix: sed -i '' 's/alt/neu/g' datei — mit einem Leerzeichen zwischen -i und dem leeren String. Das gleiche Skript schlägt auf der jeweils anderen Plattform fehl: GNU sed interpretiert '' als Dateiname, BSD sed ohne Backup-Suffix als Fehler.

perl -i ist die portable Alternative: perl -i -pe 's/alt/neu/g' datei funktioniert identisch auf GNU/Linux und macOS. Mit einem Suffix erstellt perl automatisch ein Backup: perl -i.bak -pe 's/alt/neu/g' datei erstellt datei.bak. Der wichtige Unterschied zum sed-In-Place-Editing: perl liest die vollständige Datei in ein virtuelles Dateihandle, schreibt in eine temporäre Datei und ersetzt die originale Datei nach dem Ende — Symlinks und Hard-Links werden korrekt behandelt. Beim Einsatz von sed, awk und perl in plattformübergreifenden Skripten ist perl -i -pe die robuste Wahl für In-Place-Editing.


#!/usr/bin/env bash
# inplace-editing.sh — Cross-platform in-place editing patterns
set -euo pipefail

CONFIG_FILE="./config/database.php"
BACKUP_SUFFIX=".bak-$(date +%Y%m%d)"

# --- WRONG: sed -i breaks on macOS/BSD ---
# sed -i 's/localhost/10.0.0.5/' "$CONFIG_FILE"   # GNU only
# sed -i '' 's/localhost/10.0.0.5/' "$CONFIG_FILE" # BSD only

# --- RIGHT: perl -i is portable across GNU and BSD ---
perl -i -pe "s/'host' => 'localhost'/'host' => '10.0.0.5'/" "$CONFIG_FILE"

# With backup — perl creates CONFIG_FILE.bak-YYYYMMDD
perl -i"$BACKUP_SUFFIX" -pe 's/APP_DEBUG=true/APP_DEBUG=false/' .env

# Multiple substitutions in one pass (more efficient than chained pipes)
perl -i -pe '
  s/DB_HOST=localhost/DB_HOST=10.0.0.5/;
  s/DB_PORT=3306/DB_PORT=5432/;
  s/DB_DRIVER=mysql/DB_DRIVER=pgsql/;
' .env.production

# Conditional substitution: only on lines matching a pattern
perl -i -pe 's/timeout=\d+/timeout=30/ if /^database/' config.ini

# Multiline: replace block between two markers (impossible with sed -i portably)
perl -i -0777 -pe 's/<!-- BEGIN GENERATED -->.*?<!-- END GENERATED -->/<!-- REPLACED -->/s' index.html

6. Multiline-Verarbeitung: wo sed aufhört und perl anfängt

sed verarbeitet Eingabe zeilenweise — der "Stream" ist tatsächlich eine Zeile. Mehrzeilige Muster erfordern in sed den Einsatz des Hold-Space (H, G, N Befehle), was sed-Skripte schnell unlesbar macht. Für das Löschen oder Ersetzen eines mehrzeiligen Blocks in einer Konfigurationsdatei ist sed im Trio sed, awk und perl das falsche Werkzeug. awk kann mit getline und Zählung über mehrere Zeilen arbeiten, ist aber ebenfalls nicht für elegante Multiline-Muster ausgelegt.

perl mit dem Flag -0777 liest die gesamte Datei als einen einzigen String in den Speicher. Kombiniert mit dem Modifier /s (Punkt matcht auch Newline) und /m (^ und $ matchen Zeilenanfang/-ende statt Dateistart/-ende) werden Multiline-Substitutionen trivial: s/BEGIN.*?END/REPLACE/s ersetzt alles zwischen BEGIN und END inklusive mehrerer Newlines. Das ist der Kernvorteil von perl gegenüber sed und awk bei der Verarbeitung von HTML, XML-Fragments, Konfigurationsblöcken und mehrzeiligen Log-Einträgen. Für alle Multiline-Aufgaben im Trio sed, awk und perl ist perl die erste und meist einzige sinnvolle Wahl.

7. Performance-Vergleich: wann jedes Werkzeug schneller ist

Bei der Performance im Trio sed, awk und perl gewinnt in der Regel das spezialisierte Werkzeug für die spezifische Aufgabe. sed ist für einfache zeilenweise Substitutionen am schnellsten — kein Interpreter-Overhead, minimaler Speicherverbrauch. awk ist schneller als perl für Feldverarbeitung und Aggregationen, weil das Splitting bereits optimiert ist. perl ist schneller als awk und sed für komplexe Transformationen mit mehreren Schritten, weil ein einziger perl-Aufruf ersetzen kann, was sonst eine mehrstufige Pipeline aus sed, awk, grep und cut wäre.

Der eigentliche Performance-Engpass bei der Textverarbeitung in Shell-Skripten ist meist nicht das Werkzeug selbst, sondern die Pipeline-Struktur. Jedes Pipe-Symbol bedeutet einen Fork-Syscall und einen neuen Prozess. cat datei | sed ... | awk ... | grep ... startet vier Prozesse. Ein einziger awk- oder perl-Aufruf, der alle vier Transformationen enthält, ist messbar schneller — besonders bei großen Dateien oder in Schleifen. Beim Einsatz von sed, awk und perl in Performance-kritischen Shell-Skripten gilt: Pipes minimieren und Transformationen zusammenfassen.

8. Praxisbeispiele aus Shell-Skripten und CI/CD

In CI/CD-Pipelines und Deployment-Skripten kommen sed, awk und perl täglich zum Einsatz: Versionsnummern in Konfigurationsdateien ersetzen, Build-Artefakte patchen, Log-Ausgaben für Monitoring-Systeme formatieren und Konfigurationsblöcke zwischen Umgebungen substituieren. Die Entscheidung, welches Werkzeug man für welche Aufgabe einsetzt, hat direkten Einfluss auf die Portabilität und Wartbarkeit der CI/CD-Konfiguration.

Ein häufiges Muster in Magento-Deployment-Skripten: Die app/etc/env.php-Datei enthält datenbankspezifische Werte, die pro Umgebung unterschiedlich sind. Das naheliegendste Werkzeug ist perl -i -pe für In-Place-Substitutionen, weil es portabel ist und mehrere Substitutionen in einem Schritt erledigt. Für die Analyse von Magento-Logs ist awk ideal: Fehlermeldungen nach Häufigkeit zählen, Response-Zeiten aggregieren, Exception-Typen extrahieren. Für einfache Konfigurationssubstitutionen reicht sed — solange man die Portabilitätsfalle bei -i vermeidet.

9. sed, awk und perl im direkten Vergleich

Die Entscheidung zwischen sed, awk und perl für eine konkrete Aufgabe lässt sich anhand weniger Kriterien treffen. Die folgende Tabelle zeigt typische Szenarien und die empfohlene Wahl.

Aufgabe sed awk perl
Einfache Substitution Ideal — s/a/b/g Möglich, aber verbose Überdimensioniert
Felder extrahieren / summieren Nicht vorgesehen Ideal — $1, $NF, sum+=$3 Möglich, mehr Code
Multiline-Muster Hold-Space: schwer lesbar Umständlich Ideal — -0777 + /s
In-Place-Editing portabel GNU/BSD inkompatibel Nicht nativ Ideal — perl -i -pe
Unicode / Encoding Implementierungsabhängig Eingeschränkt Vollständig mit use utf8

Das Trio sed, awk und perl ergänzt sich, konkurriert aber nicht. In der Praxis setzt man alle drei ein — jedes für die Aufgaben, für die es optimiert ist. Ein Deployment-Skript kann sed für schnelle Zeilen-Substitutionen in Konfigurationsdateien verwenden, awk für die Analyse von Log-Ausgaben und perl für portables In-Place-Editing und Multiline-Transformationen. Die Lesbarkeit des Codes und die Portabilität über Plattformen sind die entscheidenden Kriterien für die Wahl zwischen sed, awk und perl.

Mironsoft

Shell-Automatisierung, DevOps-Tooling und Deployment-Infrastruktur

Textverarbeitung in Shell-Skripten, die portabel und wartbar ist?

Wir analysieren bestehende Shell-Skripte auf Portabilitätsprobleme bei sed/awk/perl und refaktorisieren Textverarbeitungslogik für plattformübergreifende Zuverlässigkeit in CI/CD-Pipelines.

Portabilitätsaudit

GNU/BSD-Inkompatibilitäten in sed, awk und grep identifizieren

Refactoring

Mehrstufige Pipes durch effiziente awk/perl-Einzeiler ersetzen

CI/CD-Integration

Textverarbeitungs-Skripte in Cross-Platform-Pipelines einbinden

10. Zusammenfassung

Die richtige Wahl zwischen sed, awk und perl ist keine Prestigefrage, sondern eine pragmatische Entscheidung: sed für schnelle, einfache zeilenweise Substitutionen und Filterungen. awk für strukturierte Eingaben mit Feldern, Aggregationen und Berichte. perl für Multiline-Muster, portables In-Place-Editing, Unicode und komplexe mehrstufige Transformationen. Diese Dreiteilung folgt dem Unix-Prinzip, für jede Aufgabe das passende Werkzeug zu verwenden.

Die praktisch wichtigste Einzelentscheidung beim Einsatz von sed, awk und perl in plattformübergreifenden Skripten: In-Place-Editing immer mit perl -i -pe statt sed -i. Die GNU/BSD-Inkompatibilität von sed -i ist die häufigste Quelle von "läuft lokal auf dem Mac, schlägt in CI fehl"-Problemen. Wer außerdem mehrstufige Pipes durch einzelne awk- oder perl-Aufrufe konsolidiert, reduziert Fork-Overhead und macht Skripte robuster.

sed, awk und perl — Das Wichtigste auf einen Blick

sed

Zeilenweise Substitution, Filterung, Ausgabe von Bereichen. GNU und BSD inkompatibel bei -i. Für einfache, schnelle Einzeiler ideal.

awk

Felder ($1, $NF), Aggregation (sum, count), BEGIN/END-Blöcke, assoziative Arrays. Ideal für strukturierte Texte und Log-Analyse.

perl

Multiline mit -0777 und /s, portables In-Place mit -i, Unicode mit use utf8. Eskalationsstufe für komplexe Transformationen.

Performance

Pipes minimieren. Ein awk/perl-Aufruf statt mehrerer Pipes ist schneller. Spezialisiertes Werkzeug für die spezifische Aufgabe wählen.

11. FAQ: sed, awk und perl in Shell-Skripten

1Wann sed statt awk?
sed für einfache zeilenweise Substitution. Wenn Felder extrahiert oder Werte aggregiert werden sollen, ist awk von Anfang an die bessere Wahl.
2Warum sed -i auf macOS problematisch?
BSD sed braucht Backup-Suffix: sed -i '' ... — GNU sed nicht. perl -i -pe ist die portable Alternative für beide Plattformen.
3Mehrzeilige Muster mit perl?
perl -0777 -pe liest gesamte Datei als String. /s macht Punkt zum Allzeichen inklusive Newline. Multiline-Substitutionen damit trivial.
4BEGIN und END in awk?
BEGIN läuft vor erster, END nach letzter Zeile. Für Initialisierung und finale Ausgabe von Aggregaten. Ideal für Summation und Statistiken.
5Assoziative Arrays in awk?
Ja, nativ. count[$1]++ zählt Vorkommnisse. In END über alle Schlüssel iterieren: for (k in count) print k, count[k].
6Performance durch weniger Pipes verbessern?
Statt cat | sed | awk | grep alle Schritte in einem einzigen awk/perl. Jedes Pipe-Symbol ist ein Fork-Syscall — bei großen Dateien messbar.
7Wie handhabt perl Unicode?
use utf8 für Quellcode-Literale. use open ':std', ':utf8' für alle Streams. Unicode-Properties in Regex mit \p{L} etc.
8Wann perl besser als awk?
Multiline-Muster, komplexe Datenstrukturen, portables In-Place-Editing, Unicode-Eingaben oder wenn das awk-Skript zu lang wird.
9Feldtrennzeichen in awk setzen?
Mit -F',' für Komma oder BEGIN{FS="\t"} für Tab. Mehrere Trennzeichen per Regex: -F'[,;:|]'
10sed: mehrere Substitutionen in einem Durchlauf?
Mit mehreren -e: sed -e 's/a/b/' -e 's/c/d/' oder Semikolon: sed 's/a/b/; s/c/d/'. Für viele Substitutionen perl -pe lesbarer.