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

Trennzeichen ändern

# Bei Pfaden praktisch
sed 's|/var/www|/home/web|g' datei

# Beliebiges Zeichen möglich
sed 's#alt#neu#g' datei

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

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

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

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

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

awk - Mustersuche und Textverarbeitung

Grundlagen

awk 'Muster { Aktion }' datei

Spalten 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)}' datei

Trennzeichen

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

Bedingungen

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

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

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

Formatierte 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 Dezimalstellen

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

awk-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]}' datei

Bedingungen

awk '{
    if ($3 > 100)
        print $1, "high"
    else
        print $1, "low"
}' datei

Schleifen

# For-Schleife
awk '{for (i=1; i<=NF; i++) print $i}' datei

# While-Schleife
awk '{
    i = 1
    while (i <= NF) {
        print $i
        i++
    }
}' datei

Funktionen

# 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)}'       # Trigonometrie

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

Kombinationen

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

Mit 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 -20

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

Tipps

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

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

Zusammenfassung

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