Divide arquivos de log grandes

1

Estou tentando dividir um arquivo de log grande em arquivos menores com base na data.

O arquivo é da seguinte forma, onde algumas linhas podem não ter uma data. Essas linhas devem ser incluídas com a linha anterior datada.

2014-04-07T23:59:58 CheckForCallAction [ERROR] Exception caught
Undated line 1
Undated line 2
2014-04-08T00:00:03 MobileAppRequestFilter [DEBUG] Action
undated line 3
2015-04-08T00:00:03 MobileAppRequestFilter [DEBUG] ActionB

Eu encontrei Como extrair logs entre dois carimbos de hora que está perto do que eu quero, exceto que meu arquivo de log não inclui um "[" no início da data ou "]" e o final da data.

O comando desse link é:

awk -F'[[]|[]]' \
  '$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
   $0 ~ /^\[/ && $2 >= "2014-04-08 02:00" { p=0 }
   p { print $0 }' > test1.log  logwith[.log

Eu tenho tentado por vários dias para modificar isso, mas eu simplesmente não consigo entender.

Um aprimoramento desejado seria não precisar especificar uma data de início e término, mas sim nomear automaticamente os arquivos de saída por ano ou mês do ano.

    
por Mike 07.04.2016 / 16:41

1 resposta

1

Use T como o delimitador de campo e verifique se há cadeias semelhantes a data explicitamente. Por exemplo, para dividir por ano:

awk -FT '($1~/^[0-9]+-[0-9]+-[0-9]+$/){d=substr($1,1,4)}{print > d".log"}' logfile 

E por ano + mês:

awk -FT '($1~/^[0-9]+-[0-9]+-[0-9]+$/){split($1,d,"-")}{print > d[1]d[2]".log"}' logfile 

Aqui, verificamos que o primeiro campo (definido por T , portanto, toda a data nas linhas que começam com datas, é o que -FT significa) é um conjunto de 3 números separados por - . Se for, para obter o ano, extraímos os primeiros 4 caracteres ( d=substr($1,1,4) ) e, para obter o mês, dividimos o primeiro campo em - , salvando as sequências resultantes na matriz d ( split($1,d,"-") ), e use os primeiros dois elementos da matriz ( d[1]d[2] ) para o nome do arquivo.

    
por 07.04.2016 / 17:01