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
#) entfernensed '/^#/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:SSam Zeilenanfang)sed 's/^[0-9-]\{10\} [0-9:]\{8\} //' app.log > app.notime.log - Level normalisieren (
INFO→HINWEIS)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:-ierlaubt 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 einensed-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!)
- Nur Treffer zählen (lohnt sich die Aktion überhaupt?):
grep -Rnc --include="*.log" '203\.0\.113\.42' /var/log
- Vorschau der Ersetzungen an einer Datei:
sed 's/203\.0\.113\.42/ANON_IP/g' access.log | head
- 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
- 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, dieERRORenthalten.grep -Rli --include="*.log" 'ERROR' /var/log
- Ersetze
ERROR→FEHLERin genau diesen Dateien mit Backup.
2. IP-Anonymisierung im Apache-Ordner:
- Ersetze
203.0.113.42durchANON_IPin allen*.logunter/var/log/apache2. - Prüfe per
diff, was sich geändert hat.
3. Cleanup-Skript schreiben:
- Lege log_
cleanup.sedan, das - leere Zeilen löscht,
- Timestamps entfernt,
DEBUG-Zeilen löscht.
Wende es rekursiv auf/var/log/myapp/an (mit Backups).
✅ Zusammenfassung
sedeignet sich perfekt, um Logs zu bereinigen oder massiv zu ändern (z. B. IP-Anonymisierung) – auch über viele Dateien.- Für viele Dateien:
sed -i.bakmitfind … -exec … +odergrep -rl … | xargs sed -i.bak …ist der Standard-Workflow. - Sicherheit: Immer mit Dry-Run, Backups und ggf.
diffarbeiten. - Rotationen/Kompression beachten (
*.gzausschließ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
