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/\bINFO\b/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