tem um arquivo de log que eu gostaria de dividir em vários arquivos baseados em conteúdo

0

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 logs apropriados entre as seções, então eu teria que procurar a segunda instância de cada título e copiar os dados até o segundo instância do próximo título.

Corpo

*** Configuration Database
    (Data/Logs)

*** Logs
    (Data/Logs)

*** Configuration Logs
    (Data/Logs)

*** Query Logs
    (Data/Logs)

Basicamente, gosto de usar o arquivo de texto de depuração, executar um script e quebrá-lo em vários arquivos de texto, um para cada seção do Índice, mantendo o original intacto. Então eu basicamente teria o debug.txt, o Configuration Database.txt, o Logs.txt, etc, cada um com todos os dados em cada seção, até quando a nova seção for iniciada. Qualquer ajuda seria muito apreciada, pois isso está um pouco acima da minha cabeça:)

    
por bkoverflow 20.05.2016 / 17:39

1 resposta

2

Tente isto:

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

Como funciona

o 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 fname para essa linha. Caso contrário, atualizamos a matriz associativa seen para indicar que vimos essa linha uma vez.

  • fname{print>fname}

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

por 20.05.2016 / 19:14

Tags