Logs sind oft „laut“: Kommentare, Debug-Zeilen, lange Timestamps. Mit sed kannst du sie schnell bereinigen, vereinheitlichen oder Massen-Ersetzungen durchführen (z. B. IPs anonymisieren) - sogar über viele Dateien hinweg.

🔹 Schnellbereinigung einzelner Dateien

  • Kommentare (beginnend mit #) entfernen
    sed '/^#/d' app.log > app.clean.log
  • Leere Zeilen entfernen
    sed '/^[[:space:]]*$/d' app.log > app.clean.log
  • Timestamps abschneiden (Beispiel: YYYY-MM-DD HH:MM:SS am Zeilenanfang)
    sed 's/^[0-9-]{10} [0-9:]{8} //' app.log > app.notime.log
  • Level normalisieren (INFOHINWEIS)
    sed 's/bINFOb/HINWEIS/g' app.log > app.norm.log
Tipp: Erst ohne -i (in-place) arbeiten und in neue Dateien schreiben – so siehst du das Ergebnis risikofrei.

🔹 Sicher in-place ändern (mit Backup)

Wenn das Ergebnis passt, kannst du direkt in der Datei ersetzen - mit Backup:
sed -i.bak 's/OLD/IP_NEU/g' access.log
# erzeugt: access.log.bak
macOS/BSD: -i '' (ohne Backup) oder -i .bak (mit Suffix) nutzen. GNU/Linux: -i erlaubt optionales Suffix wie oben.

🔹 In vielen Logdateien gleichzeitig ersetzen

Variante A: Globbing (ein Ordner)
sed -i.bak 's/203.0.113.42/ANON_IP/g' /var/log/apache2/*.log
Variante B: Rekursiv mit find Nur reguläre Dateien mit Endung .log:
find /var/log -type f -name "*.log" -exec sed -i.bak 's/203.0.113.42/ANON_IP/g' {} +
Das + hängt viele Dateien an einen sed-Aufruf an (performant). Punkt in IPs escapen: . matcht einen echten Punkt, nicht „beliebiges Zeichen“.
Variante C: Mit xargs (falls du gezielt aus einer Trefferliste arbeiten willst)Erst Dateien mit dem Wort/IP finden, dann nur dort ersetzen:
grep -rl --exclude='*.bak' '203.0.113.42' /var/log 
| xargs sed -i.bak 's/203.0.113.42/ANON_IP/g'
  • grep -r → rekursiv
  • -l → nur Dateinamen
  • --exclude → Backups/Rotations ausschließen
Variante D: Rotierte Logs berücksichtigen Nur unkomprimierte Logs (ohne .gz) bearbeiten:
find /var/log -type f -name "*.log" ! -name "*.gz" -exec sed -i.bak 's/foo/bar/g' {} +
Komprimierte Logs vorher entpacken oder mit zgrep/zcat arbeiten (lesen/prüfen), danach wieder packen.

🔹 Dry-Run & Sicherheit (empfohlen!)

  1. Nur Treffer zählen (lohnt sich die Aktion überhaupt?):
    grep -Rnc --include="*.log" '203.0.113.42' /var/log
  2. Vorschau der Ersetzungen an einer Datei:
    sed 's/203.0.113.42/ANON_IP/g' access.log | head
  3. Diff vor/nachher (bei In-Place mit Backup):
    sed -i.bak 's/203.0.113.42/ANON_IP/g' access.log
    diff -u access.log.bak access.log | less
  4. Rechte bedenken: Viele Logs sind Root-geschützt → Befehle ggf. mit sudo ausführen.

🔹 Typische Bereinigungsrezepte für Logs

  • Nur ERROR/WARN behalten:
    sed -n '/ERROR|WARN/p' app.log > app.errors.log
  • Zeitstempel eckige Klammern entfernen: [2025-09-24 12:34:56]
    sed 's/^[[^]]*] //' app.log > app.no_brackets.log
  • IP-Adressen anonymisieren (IPv4 generisch):
    sed -E 's/([0-9]{1,3}.){3}[0-9]{1,3}/ANON_IP/g' access.log > access.anon.log
  • Pfadpräfix kürzen (z. B. lange Root-Pfadanteile):
    sed 's|/var/www/html||g' access.log > access.short.log

🔹 Bonus: Kombi mit awk/sort/uniq nach der Bereinigung

Beispiel: IPs anonymisieren und häufigste Pfade zählen:
sed -E 's/([0-9]{1,3}.){3}[0-9]{1,3}/ANON_IP/g' access.log 
| awk '{print $7}' 
| sort | uniq -c | sort -nr | head

🔹 Übungen

1. Mehrdatei-Ersetzung (Dry-Run → Live):
  • Finde alle Logs unter /var/log, die ERROR enthalten.
    grep -Rli --include="*.log" 'ERROR' /var/log
  • Ersetze ERRORFEHLER in genau diesen Dateien mit Backup.
2. IP-Anonymisierung im Apache-Ordner:
  • Ersetze 203.0.113.42 durch ANON_IP in allen *.log unter /var/log/apache2.
  • Prüfe per diff, was sich geändert hat.
3. Cleanup-Skript schreiben:
  • Lege log_cleanup.sed an, das
  • leere Zeilen löscht,
  • Timestamps entfernt,
  • DEBUG-Zeilen löscht. Wende es rekursiv auf /var/log/myapp/ an (mit Backups).

✅ Zusammenfassung

  • sed eignet sich perfekt, um Logs zu bereinigen oder massiv zu ändern (z. B. IP-Anonymisierung) – auch über viele Dateien.
  • Für viele Dateien: sed -i.bak mit find … -exec … + oder grep -rl … | xargs sed -i.bak … ist der Standard-Workflow.
  • Sicherheit: Immer mit Dry-Run, Backups und ggf. diff arbeiten.
  • Rotationen/Kompression beachten (*.gz ausschließen oder entpacken).
👉 Im nächsten Kapitel (4) analysieren wir bereinigte Logs mit awk: Statuscodes zählen, IP-Toplisten, Spitzenzeiten pro Stunde – alles direkt im Terminal. Möchtest du, dass ich Kapitel 4 gleich schreibe?  

📚 Inhaltsverzeichnis

👉 Log-Analyse Kapitel 1: Logs im Terminal lesen – cat, less, tail & grep 👉 Log-Analyse Kapitel 2: Filtern mit grep und regulären Ausdrücken 👉 Log-Analyse Kapitel 3: Logs bereinigen mit sed – inkl. Mehrdatei-Änderungen 👉 Log-Analyse Kapitel 4: Logs analysieren mit awk 👉 Log-Analyse Kapitel 5: Logs kombinieren mit grep, sed, awk, sort, uniq & cut 👉 Log-Analyse Kapitel 6: Praxisprojekt – Apache-/Nginx-Access-Logs analysieren 👉 Log-Analyse Kapitel 7: Praxisprojekt – Systemlogs analysieren (auth.log & journalctl)

⭐ Bonus-Kapitel

👉 Log-Analyse Kapitel 8 (Bonus): Eigene Auswertungs-Skripte für Logs schreiben 👉 Log-Analyse Kapitel 9 (Bonus): Logs visualisieren mit CSV & gnuplot