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' datei

In-Place bearbeiten

# Datei direkt ändern
sed -i 's/alt/neu/g' datei

# Mit Backup
sed -i.bak 's/alt/neu/g' datei

Zeilen 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

Drucken

# Nur bestimmte Zeilen
sed -n '5p' datei           # Zeile 5
sed -n '5,10p' datei        # Zeilen 5-10
sed -n '/muster/p' datei    # Zeilen mit Muster

Regex

# Wortgrenzen
sed 's/\bwort\b/ersatz/g' datei

# Gruppen
sed 's/\(.*\):\(.*\)/\2:\1/' datei  # Tauschen

# Erweiterte Regex
sed -E 's/[0-9]+/NUMBER/g' datei

Mehrzeilig

# 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/' datei

awk - Pattern-Scanning

Grundsyntax

awk 'muster { aktion }' datei
awk -F: '{ print $1 }' datei  # Feldtrenner

Felder

# 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.csv

Eingebaute 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' datei

Berechnungen

# 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 }' datei

Formatierte Ausgabe

# printf
awk '{ printf "%-10s %5d\n", $1, $2 }' datei

# Spalten formatieren
awk '{ printf "%s,%s,%s\n", $1, $2, $3 }' datei

BEGIN und END

awk 'BEGIN { print "Start" } { print $0 } END { print "Ende" }' datei

# Header hinzufügen
awk 'BEGIN { print "Name,Size" } { print $1 "," $2 }' datei

Bedingungen 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++ } }' datei

Arrays

# 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 -rn

Praktische 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.log

Config-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.conf

CSV-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.csv

Passwd-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/passwd

Netzwerk-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 -rn

Datenbank-Dump

# Tabellennamen
grep "CREATE TABLE" dump.sql | sed 's/.*`\(.*\)`.*/\1/'

# Bestimmte Tabelle extrahieren
sed -n '/CREATE TABLE `users`/,/^--$/p' dump.sql

Kombinationen

# 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 -10

Zusammenfassung

| 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.