Ich habe eine Protokolldatei, die ich je nach Inhalt in mehrere Dateien aufteilen möchte

Ich habe eine Protokolldatei, die ich je nach Inhalt in mehrere Dateien aufteilen möchte

Ich habe eine Protokolldatei, die ich in mehrere Dateien aufteilen möchte

Inhaltsverzeichnis

*** Configuration Database
*** Logs
*** Configuration Logs
*** Query Logs
    .
    .
    and so on

Das Problem besteht darin, dass die Titel des Abschnitts mit den entsprechenden Daten oder Protokollen zwischen den Abschnitten erneut im Textkörper angezeigt werden. Daher müsste ich nach der zweiten Instanz jedes Titels suchen und die Daten bis zur zweiten Instanz des nächsten Titels kopieren.

Körper

*** Configuration Database
    (Data/Logs)

*** Logs
    (Data/Logs)

*** Configuration Logs
    (Data/Logs)

*** Query Logs
    (Data/Logs)

Ich möchte grundsätzlich die Debug-Textdatei nehmen, ein Skript darauf ausführen und die Datei in mehrere Textdateien aufteilen lassen, eine für jeden Abschnitt im Inhaltsverzeichnis, wobei das Original intakt bleibt. Ich hätte also grundsätzlich debug.txt, Configuration Database.txt, Logs.txt usw., die jeweils alle Daten in jedem Abschnitt enthalten, bis der neue Abschnitt beginnt. Für jede Hilfe wäre ich sehr dankbar, da mir das etwas zu hoch ist :)

Antwort1

Versuche dies:

awk '/^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];} fname{print>fname}' file

Wie es funktioniert

awk liest eine Datei implizit Zeile für Zeile. Für jede gelesene Zeile führen wir Folgendes aus:

  • /^[*][*][*] /{ if ($0 in seen) fname=$0; else seen[$0];}

    Bei jeder Zeile, die mit drei Sternen und einem Leerzeichen beginnt, prüfen wir, ob wir diese Zeile schon einmal gesehen haben. Wenn ja, setzen wir fnameauf diese Zeile. Andernfalls aktualisieren wir das assoziative Array, seenum anzuzeigen, dass wir diese Zeile schon einmal gesehen haben.

  • fname{print>fname}

    Wenn fnamees sich um einen nicht leeren Wert handelt, schreiben Sie die aktuelle Zeile in die Datei mit dem Namen fname.

verwandte Informationen