есть файл журнала, который я хотел бы разбить на несколько файлов в зависимости от содержания

есть файл журнала, который я хотел бы разбить на несколько файлов в зависимости от содержания

У меня есть файл журнала, который я хотел бы разбить на несколько файлов.

Оглавление

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

Проблема в том, что заголовки разделов снова появляются в теле документа с соответствующими данными или журналами между разделами, поэтому мне придется искать второй экземпляр каждого заголовка и копировать данные до второго экземпляра следующего заголовка.

Тело

*** Configuration Database
    (Data/Logs)

*** Logs
    (Data/Logs)

*** Configuration Logs
    (Data/Logs)

*** Query Logs
    (Data/Logs)

Я бы хотел взять файл отладочного текста, запустить скрипт против него и разбить файл на множество текстовых файлов, по одному для каждого раздела в таблице содержания, оставив оригинал нетронутым. Поэтому я бы в основном имел debug.txt, Configuration Database.txt, Logs.txt и т. д., каждый из которых содержал бы все данные в каждом разделе, вплоть до начала нового раздела. Любая помощь была бы очень кстати, так как это немного выше моего понимания :)

решение1

Попробуй это:

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

Как это работает

awk неявно читает файл построчно. Для каждой прочитанной строки мы делаем следующее:

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

    Для любой строки, которая начинается с трех звезд и пробела, мы проверяем, видели ли мы эту строку раньше. Если видели, мы устанавливаем fnameна эту строку. В противном случае мы обновляем ассоциативный массив, seenчтобы указать, что мы видели эту строку один раз.

  • fname{print>fname}

    Если fname— непустое значение, то записать текущую строку в файл с именем fname.

Связанный контент