Neuordnen von Einträgen in Logdatei (Ein Eintrag pro Zeile)

Hallo,
Ich habe mit einem selbstgeschriebenem Skript RSSI Werte protokolliert. Jeder Eintrag beginnt mit der Jahreszahl 2024 und sollte in einer eigenen Zeile in der Logdatei stehen.
Leider war dieses Skript aus irgendwelchen Gründen fehlerhaft, die Folge ist das oft mehrere Logvorgänge in einer Zeile stehen.
Das Ganze sieht jetzt in etwa so aus (Auszug):

2024-01-05 15:29 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:30 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:31 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:32 C0 00:04:D9:80:3B:F5 0 55
2024-01-05 15:33 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:34 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:35 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:36 C0 00:04:D9:80:3B:F5 0 55
2024-01-05 15:37 C0 00:04:D9:80:3B:F5 0 45 2024-01-05 15:38 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:39 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:40 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:41 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:42 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:43 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:44 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:45 C0 00:04:D9:80:3B:F5 0 55 2024-01-05 15:46 C0 00:04:D9:80:3B:F5 0 13 2024-01-05 15:47 C0 00:04:D9:80:3B:F5 0 13 2024-01-05 15:48 C0 00:04:D9:80:3B:F5 0 15

Ich habe folgendes probiert, das hat allerdings nicht funktioniert:

#!/bin/bash

# Pfad zur Logdatei
LOGFILE="rssi_17_02_2024.log"

# Temporäre Datei für die Bearbeitung erstellen
TMPFILE=$(mktemp)

# Durch die Logdatei iterieren
while IFS= read -r line; do
    # Prüfen, ob die Zeile die Jahreszahl "2024" enthält
    if [[ $line == *" 2024"* ]]; then
        # Neue Zeile mit gewünschtem Text einfügen
        echo >> "$TMPFILE"
    fi
    # Zeile aus der Logdatei in die temporäre Datei schreiben
    echo "$line" >> "$TMPFILE"
done < "$LOGFILE"

# Temporäre Datei in die ursprüngliche Logdatei kopieren
mv "$TMPFILE" "rssi_korrigiert.log"

echo "Bearbeitung abgeschlossen!"

Irgendwelche Ideen?

Geht mit einem Editor wie Kate ganz einfach.

Suchen und Ersetzen auswählen
“Regulärer Ausdruck” auswählen
Suchen: 2024-
Ersetzen: \n2024-
Alle ersetzen

fertig…

2 Likes

Ah gut! Bleibt nur die Frage, was ich im zweiten Schritt im Suchen Feld eingeben muss, um die Leerzeilen herauszufiltern und zu löschen

Ich habe es : \n\n
Problem gelöst, Dankeschön! :grin:

Auch wenn ich zu spät bin, aber ich liebe sed für sowas.
Schnell und schmutzig sieht das so aus:

$ sed -e’s/2024-/\n$1/g’ rssi_17_02_2024.log | sed -e ‘/^$/d’ > rssi_korrigiert.log

Der erste Ausdruck sucht durch das “g” am Ende des ersten Ausdrucks überall nach “2024-”, weil damit deine Ausgaben scheinbar immer anfangen.
Und ersetzt das “2024-” mit \n und dem Match-Pattern $1, macht also einen Zeilenumbruch vor das 2024-. Statt $1 könntest du auch einfach nochmal “2024-” hinter das \n schreiben.
Das ganze wird dann nochmal durch sed gepiped, um im zweiten Schritt die Leerzeilen (bestehend aus Zeilenbeginn und Zeilenende direkt hintereinander) zu entfernen.

Geht sicher auch noch schöner, aber als kleiner Einzeiler reicht es mir :slight_smile:

1 Like

Nur einmal sed anrufen, aber mit zwei -e?, Also ungefäḧr:

cat  rssi_17_02_2024.log | sed -e ’s/2024-/\n$1/g’  -e  ‘/^$/d’ > rssi_korrigiert.log

oder

sed -e ’s/2024-/\n$1/g’  -e  ‘/^$/d’ rssi_17_02_2024.log > rssi_korrigiert.log

Hab ich versucht mit 2x -e in einem Kommando, aber die Leerzeilen tauchen ja erst nach dem ersten Ersetzen, also durch das erste -e auf. Da scheint das zweite -e nicht mehr zu greifen.
Und ich hab einen Fehler drin. Es muss nicht $1, sondern &1 sein:
$ sed -e ‘s/2024-/\n&1/g’ rssi_17_02_2024.log | sed -e ‘/^$/d’ > rssi_korrigiert.log

Stimmt, hast du recht. Ein zweiter Durchang ist dann die Lösung.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.