tenho um arquivo de log que gostaria de dividir em vários arquivos com base no conteúdo

tenho um arquivo de log que gostaria de dividir em vários arquivos com base no conteúdo

Eu tenho um arquivo de log que gostaria de dividir em vários arquivos

Índice

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

O problema é que os títulos da seção aparecem novamente no corpo com os dados ou registros apropriados entre as seções, então eu teria que procurar a segunda instância de cada título e copiar os dados até a segunda instância do próximo título.

Corpo

*** Configuration Database
    (Data/Logs)

*** Logs
    (Data/Logs)

*** Configuration Logs
    (Data/Logs)

*** Query Logs
    (Data/Logs)

Basicamente, eu gostaria de pegar o arquivo de texto de depuração, executar um script nele e dividir o arquivo em vários arquivos de texto, um para cada seção do Índice, mantendo o original intacto. Então, eu basicamente teria debug.txt, Configuration Database.txt, Logs.txt, etc, cada um com todos os dados de cada seção, até o início da nova seção. Qualquer ajuda seria muito apreciada, pois isso está um pouco além da minha cabeça :)

Responder1

Experimente isto:

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

Como funciona

awk lê implicitamente um arquivo linha por linha. Para cada linha lida, fazemos o seguinte:

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

    Para qualquer linha que comece com três estrelas e um espaço, verificamos se já vimos essa linha antes. Se tivermos, definimos fnameessa linha. Caso contrário, atualizamos o array associativo seenpara indicar que vimos esta linha uma vez.

  • fname{print>fname}

    Se fnamefor um valor não vazio, escreva a linha atual no arquivo chamado fname.

informação relacionada