Script-Spielerei (1) – FritzBox Protokoll als csv-Datei

Hallo,

heute nach langer Zeit mal wieder ein neuer Blogeintrag. Seit langer Zeit ärgert mich die Tatsache, dass ich das Ereignisprotokoll der FritzBox nicht so einfach als csv-Datei exportieren kann, damit ich die Dateien besser auswerten kann.
Zur Erläuterung: csv steht für „comma-separated-value“, also Komma-getrennte-Werte, also praktisch eine Datei, die z.B. so aussieht:

13.05.17, 14:30:12,WLAN-Anmeldung ist gescheitert(2,4 GHz): Zugangsprüfung fehlgeschlagen. MAC-Adresse: XX:XX:XX:XX:XX:XX.
13.05.17,13:39:10, WLAN-Anmeldung ist gescheitert(2,4 GHz): Zugangsprüfung fehlgeschlagen. MAC-Adresse: XX:XX:XX:XX:XX:XX

Wenn ich im Firefox das Protokoll markiere und dann in einen Texteditor einfüge, wird aus der Liste leider folgendes:

 

13.05.17
14:30:12
WLAN-Anmeldung ist gescheitert(2,4 GHz): Zugangsprüfung fehlgeschlagen. MAC-Adresse: XX:XX:XX:XX:XX:XX.
13.05.17
13:39:10
WLAN-Anmeldung ist gescheitert(2,4 GHz): Zugangsprüfung fehlgeschlagen. MAC-Adresse: XX:XX:XX:XX:XX:XX.

Sehr ärgerlich, so lässt sich das nicht auswerten, beim Importieren in LibreOffice sieht es genauso aus.
Eine mögliche Lösung ist folgendes Script:

#!/bin/bash
# this script takes a log file where all infos are in seperate lines and re-arranges it as a csv file
# use this script this way:
# scriptname oldfile newfile lines separator

# separate lines in separate files
for ((z=0;z<${3};z++))
do
awk „$z == NR%3“ ${1} > ${z}.temp.txt
done

# join separate files

paste -d „$4“ *.temp.txt > ${2}
rm *.temp.txt

Das Script muss mit folgenden Parametern aufgerufen werden:

  1. Name der Quelldatei
  2. Name der Zieldatei
  3. aus wie vielen Zeilen besteht eine Informationssatz?
  4. Trennzeichen – unbedingt mit doppelten Anführungszeichen!

Also zum Beispiel so:

scriptname quelldatei.txt zieldatei.txt 3 „;“

Zur Funktionsweise: Zuerst zerlegt mein Script die 3., 3.+1, 3.+2 Zeile in jeweils eine extra Datei, um diese Dateien im zweiten Teil wieder  mit dem passenden Trennzeichen neu zusammenzufügen. Zum Schluss werden die temporären Dateien gelöscht.
Ist bestimmt nicht eleganteste Lösung, aber es funktioniert… Jetzt kann ich endlich FritzBox-Protokolle richtig auswerten!

Quellen:

6 Kommentare

  1. Zunächst mal die Interpreterzeile allgemeingültig machen, also statt #!/bin/bash #!/bin/sh schreiben. Das ist meist ein Link zur Standardshell des Systems. Wenn keine Bash-Sonderfunktionen verwendet werden, funktioniert es.

    Ansonsten das Ganze gleich in awk schreiben, da es als Skriptsprache für die Bearbeitung von Textdateien entwickelt wurde.

      1. Hallo linuxundmehr,

        nach etwas Rumprobieren habe ich hier ein AWK-Skript, was dir aus den Log-Daten eine CSV-Datei bastelt. In der Datei log.awk (als Anhang beigefügt) steht:

        BEGIN { # Die Zeilen zu einem Record zusammenfassen: RS=“.$“ ; FS=“\n“ # Angabe der zu einem Log gehörenden Zeilen abfragen. Leider noch nicht so ganz flüssig (ein Return reicht leider nicht): print „\nBitte gegeben Sie die Anzahl der zusammenzufassenden Zeilen an (Eingabe mit ^D abschließen):“ getline count < „-“ # Den Namen der Ausgabe-Datei erzeugen: csv_dat=ARGV[ARGC-1] gsub(/txt/, „csv“, csv_dat) } # Die eigentliche Verknüpfung der zusammengehörenden Daten zu einer tabellarischen Zeile: # Zunächst wird eine Schleife initialisiert, die anhand des Number of Fields festlegt, wie oft die folgende Schleife # aufgerufen werden soll. Die eingeschlossene Schleife gibt zunächst alle Felder des Records aus, die kleiner als die Angabe # aus der Abfrage ist. Anschließend wird das letzte Feld mit einem abschließenden Neuzeilenzeichen ausgegeben. Nun wird die # Schleife Feldnummer fortgesetzt, die sich aus dem um eins erhöhten Wert aus der Abfrage ergibt. Danach mit dem um eins erhöhten # doppelten Wert usw.  { for (i=0; i<=count+NF/count; i=i+count) { for (j=1; j<count; j++) { printf(„%s;“, $(j+i)) >> csv_dat } printf(„%s\n“, $(j+i)) >> csv_dat } }

        Wenn du dieses Skript mit  user@pc> awk -f log.awk log-test.txt wird dann die Datei log-test.csv erzeugt. Natürlich lässt sich das Skript noch verfeinern. So kann auch in der BEGIN-Funktion der Tabellenkopf für die CSV-Datei erzeugt und in die Datei geschrieben werden.

        In CSV-Dateien übliche Trenner sind „,“, „:“, „;“. Da die beiden ersten auch in deinem Beispiel auftauchen, solltest eher das Semikolon verwenden anstatt Komma. Sonst kommt es zu Fehlern in der weiteren Bearbeitung.

        Viele Grüße Thomas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmst du dem zu.

Datenschutzerklärung