awk und sed sind unverzichtbare Werkzeuge für die Textverarbeitung auf der Kommandozeile. Sie verarbeiten Daten effizient, ohne eine Programmiersprache zu benötigen.
sed - Stream Editor
Grundlagen
sed verarbeitet Text zeilenweise und führt Transformationen durch.
sed 'Befehl' datei
echo "Text" | sed 'Befehl'Suchen und Ersetzen
# Erstes Vorkommen pro Zeile
sed 's/alt/neu/' datei
# Alle Vorkommen pro Zeile (global)
sed 's/alt/neu/g' datei
# Groß-/Kleinschreibung ignorieren
sed 's/alt/neu/gi' datei
# In-Place bearbeiten
sed -i 's/alt/neu/g' datei
# Backup erstellen
sed -i.bak 's/alt/neu/g' dateiTrennzeichen ändern
# Bei Pfaden praktisch
sed 's|/var/www|/home/web|g' datei
# Beliebiges Zeichen möglich
sed 's#alt#neu#g' dateiZeilen löschen
# Bestimmte Zeile löschen
sed '5d' datei
# Zeilenbereich löschen
sed '5,10d' datei
# Erste Zeile löschen
sed '1d' datei
# Letzte Zeile löschen
sed '$d' datei
# Leere Zeilen löschen
sed '/^$/d' datei
# Zeilen mit Muster löschen
sed '/muster/d' dateiZeilen ausgeben
# Nur bestimmte Zeilen (wie head/tail)
sed -n '5p' datei # Zeile 5
sed -n '5,10p' datei # Zeilen 5-10
sed -n '1,5p' datei # Erste 5 Zeilen
sed -n '$p' datei # Letzte Zeile
# Zeilen mit Muster
sed -n '/muster/p' dateiZeilen einfügen
# Nach Zeile einfügen
sed '3a\Neue Zeile' datei
# Vor Zeile einfügen
sed '3i\Neue Zeile' datei
# Nach Muster einfügen
sed '/muster/a\Neue Zeile' dateiMehrere Befehle
# Mit -e
sed -e 's/a/A/' -e 's/b/B/' datei
# Mit Semikolon
sed 's/a/A/; s/b/B/' datei
# Als Skript
sed -f script.sed dateiPraktische Beispiele
# Kommentare entfernen
sed 's/#.*$//' config.txt
# Führende Leerzeichen entfernen
sed 's/^[ \t]*//' datei
# Trailing Whitespace entfernen
sed 's/[ \t]*$//' datei
# Mehrere Leerzeilen zu einer
sed '/^$/N;/^\n$/d' datei
# DOS zu Unix (CR entfernen)
sed 's/\r$//' datei
# XML-Tags entfernen
sed 's/<[^>]*>//g' datei
# E-Mails extrahieren
sed -n 's/.*\([a-zA-Z0-9._-]*@[a-zA-Z0-9._-]*\).*/\1/p' dateiawk - Mustersuche und Textverarbeitung
Grundlagen
awk 'Muster { Aktion }' dateiSpalten ausgeben
# Erste Spalte
awk '{print $1}' datei
# Mehrere Spalten
awk '{print $1, $3}' datei
# Mit Formatierung
awk '{print $1 " - " $2}' datei
# Alle Spalten
awk '{print $0}' datei
# Letzte Spalte
awk '{print $NF}' datei
# Vorletzte Spalte
awk '{print $(NF-1)}' dateiTrennzeichen
# Eingabe-Trennzeichen
awk -F':' '{print $1}' /etc/passwd
# Mehrere Trennzeichen
awk -F'[,;]' '{print $1}' datei
# Ausgabe-Trennzeichen
awk -F':' 'BEGIN{OFS="\t"} {print $1, $3}' /etc/passwdBedingungen
# Zeilen mit Muster
awk '/muster/' datei
# Zeilen ohne Muster
awk '!/muster/' datei
# Numerischer Vergleich
awk '$3 > 100' datei
# String-Vergleich
awk '$1 == "admin"' datei
# Mehrere Bedingungen
awk '$3 > 100 && $4 < 50' dateiEingebaute Variablen
| Variable | Bedeutung | |----------|-----------| | $0 | Ganze Zeile | | $1, $2... | Spalten | | NF | Anzahl Felder | | NR | Zeilennummer | | FS | Feld-Separator (Input) | | OFS | Feld-Separator (Output) | | RS | Record-Separator | | FILENAME | Dateiname |
# Zeilennummern
awk '{print NR, $0}' datei
# Anzahl Spalten
awk '{print NF}' datei
# Zeilen zählen
awk 'END {print NR}' dateiBEGIN und END
# Header ausgeben
awk 'BEGIN {print "Name\tSize"} {print $1, $5}' datei
# Summe berechnen
awk '{sum += $1} END {print "Sum:", sum}' datei
# Durchschnitt
awk '{sum += $1; count++} END {print "Avg:", sum/count}' dateiFormatierte Ausgabe
# printf
awk '{printf "%-20s %10.2f\n", $1, $2}' datei
# Format-Specifier
# %s - String
# %d - Integer
# %f - Float
# %10s - 10 Zeichen breit, rechtsbündig
# %-10s - 10 Zeichen breit, linksbündig
# %.2f - 2 DezimalstellenPraktische awk-Beispiele
# Summe einer Spalte
awk '{sum += $5} END {print sum}' datei
# Eindeutige Werte
awk '!seen[$1]++' datei
# Zeilen zählen nach Kriterium
awk '/ERROR/ {count++} END {print count}' logfile
# Spalten tauschen
awk '{print $2, $1}' datei
# Letzte Spalte entfernen
awk '{$NF=""; print}' datei
# CSV zu Tab-separated
awk -F',' 'BEGIN{OFS="\t"} {$1=$1; print}' datei.csv
# Top 10 IP-Adressen im Access-Log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# Spalte summieren wo Bedingung
awk '$1 == "sales" {sum += $3} END {print sum}' dateiawk-Programmierung
Variablen
awk 'BEGIN {x=0} {x += $1} END {print x}' datei
# Arrays
awk '{count[$1]++} END {for (key in count) print key, count[key]}' dateiBedingungen
awk '{
if ($3 > 100)
print $1, "high"
else
print $1, "low"
}' dateiSchleifen
# For-Schleife
awk '{for (i=1; i<=NF; i++) print $i}' datei
# While-Schleife
awk '{
i = 1
while (i <= NF) {
print $i
i++
}
}' dateiFunktionen
# Eingebaute Funktionen
awk '{print length($1)}' datei # String-Länge
awk '{print toupper($1)}' datei # Großbuchstaben
awk '{print tolower($1)}' datei # Kleinbuchstaben
awk '{print substr($1, 1, 3)}' datei # Substring
awk '{print index($0, "text")}' datei # Position finden
awk '{gsub(/alt/, "neu"); print}' datei # Ersetzen
# Mathematische Funktionen
awk '{print int($1)}' datei # Integer
awk '{print sqrt($1)}' datei # Wurzel
awk 'BEGIN {print sin(1), cos(1)}' # Trigonometrieawk-Skripte
#!/usr/bin/awk -f
# script.awk
BEGIN {
FS = ":"
print "Username\tUID\tShell"
}
{
print $1 "\t" $3 "\t" $7
}
END {
print "Total users:", NR
}awk -f script.awk /etc/passwdKombinationen
sed und awk zusammen
# Erst sed, dann awk
cat file | sed 's/,/ /g' | awk '{print $1, $3}'
# Komplexe Pipeline
cat access.log | \
sed 's/\[//g; s/\]//g' | \
awk '{print $1, $4}' | \
sort | uniq -c | sort -rnMit anderen Tools
# grep + awk
grep "ERROR" logfile | awk '{print $1, $2}'
# cut + awk
cut -d: -f1,3 /etc/passwd | awk -F: '$2 > 1000'
# sort + uniq + awk
awk '{print $1}' logfile | sort | uniq -c | awk '$1 > 100'Praktische Rezepte
Log-Analyse
# Requests pro Stunde
awk '{print $4}' access.log | cut -d: -f1,2 | sort | uniq -c
# HTTP-Status-Codes zählen
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# Slowest requests
awk '{print $NF, $7}' access.log | sort -rn | head -20System-Administration
# Benutzer ohne Shell
awk -F: '$7 ~ /nologin|false/' /etc/passwd
# Große Dateien finden
ls -la | awk '$5 > 1000000 {print $5, $9}'
# Prozesse nach Memory
ps aux | awk '{print $4, $11}' | sort -rn | head -10
# Disk Usage pro Verzeichnis
du -h /var | awk '$1 ~ /G/ {print}'Datenverarbeitung
# CSV-Spalten extrahieren
awk -F',' '{print $1 "," $3 "," $5}' data.csv
# JSON-Werte extrahieren (einfach)
awk -F'"' '/"key":/ {print $4}' data.json
# Zeilenumbrüche entfernen
awk '{printf "%s ", $0}' datei
# Zeilen zusammenfügen
awk 'NR%2==1 {line=$0} NR%2==0 {print line, $0}' dateiTipps
sed-Tipps
# Zeilen zwischen Markern
sed -n '/START/,/END/p' datei
# Nur erste Übereinstimmung
sed '0,/muster/s/muster/ersatz/' datei
# Backup-Endung
sed -i.bak 's/alt/neu/g' dateiawk-Tipps
# Leere Zeilen überspringen
awk 'NF' datei
# Erste Zeile überspringen
awk 'NR>1' datei
# Feldanzahl filtern
awk 'NF==5' datei
# Debugging
awk '{print NR, NF, $0}' dateiZusammenfassung
| Aufgabe | sed | awk | |---------|-----|-----| | Suchen/Ersetzen | s/alt/neu/g | gsub(/alt/, "neu") | | Zeilen filtern | /muster/p | /muster/ | | Zeilen löschen | /muster/d | !/muster/ | | Spalten ausgeben | - | {print $1} | | Berechnungen | - | {sum += $1} | | In-Place Edit | -i | - |
Fazit
sed eignet sich hervorragend für einfache Such- und Ersetzungsoperationen sowie zeilenbasierte Transformationen. awk ist mächtiger bei spaltenbasierter Verarbeitung, Berechnungen und komplexeren Logiken. Beide Tools zusammen mit Pipes ermöglichen komplexe Textverarbeitungen ohne vollwertige Programmiersprachen. Lernen Sie die Grundbefehle auswendig – sie sparen im Admin-Alltag enorm viel Zeit.