Como grep um arquivo de log dentro de um período de tempo específico

22

Eu tenho um arquivo de log, cada linha no log é anexada com uma data, assim:

2012-03-06 11:34:48,657 blah blah blah...

Como faço greppara obter este arquivo e obter apenas as linhas das 8h às 23h?

Minha intenção é contar o número de erros que ocorrem dentro das 8h às 23h.

Rosdi
fonte

Respostas:

24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

Explicação detalhada pode ser encontrada em vários regex (expressões regulares) tutoriais; egrepusa a sintaxe "POSIX estendida" ( man 7 regex).

  • O primeiro ^significa "início da linha".

  • [^ ]+ apenas corresponde ao campo da data, independentemente da data real.

    • [...]significa "qualquer caractere entre colchetes"; portanto [89], corresponderá a 8ou 9; [0-9]é qualquer número e [^ ]é qualquer coisa, exceto um espaço (por causa dos ^colchetes internos).

    • +significa "um ou mais dos anteriores" (por exemplo, a+iria corresponder a, aaae aaaaaaaa).

    • Assim ^[^ ]+, começará com o início da linha e corresponderá ao maior número possível de caracteres não espaciais.

  • (...|...|...)significa "um dos padrões fornecidos", então (0[89]|1[0-9]|2[012])significa "um 0[89]ou 1[0-9]ou 2[012]". Ele corresponderá a todos os números de 08 a 22.


Uma opção um pouco melhor é:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

A -Fopção divide todas as linhas em campos separados, de acordo com o [: ]regex (correspondendo a um :ou a um espaço), e o script awk verifica a 2ª coluna (a hora).

gravidade
fonte
Oi, funciona .. mas você pode adicionar uma pequena explicação de como funciona? Eu não entendo a ^[^ ]+parte ..
Rosdi
20

Por que se preocupar em usar grep? Você pode simplesmente usar sed.

exemplo:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

Isso imprimirá todos os logs entre June 17 13:39:54eJune 18 10:50:28

Nima G
fonte
11
Eu acho que o OP quer todos os registros entre 8h e 23h, bot apenas os de um dia específico.
Dennis
11
Ele pode fazer isso também. Por exemplo: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G
11
Erro de digitação desagradável. Eu quis dizer: não os de um dia específico.
Dennis
2
O problema com essa abordagem é que deve haver uma linha no arquivo de log com esse carimbo de data / hora. No exemplo acima, se não houver linha com registro de data e hora 2012-03-06 11:34:48, nada será impresso. A abordagem awk acima funcionaria nesses casos (ou seja, você deseja todos os logs com horas entre 8 e 11, mas você não sabe se existe uma entrada de log no horário 2012-03-06 08:00:00 ou algo do gênero) hora).
user650654
0

Na verdade, há uma maneira muito mais fácil de fazer isso.

Download / Documentação: autodrgrep.kl.sh

Comando:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

Explicação:

  • autodrgrep.kl.sh é o nome da ferramenta.

  • notchef é uma opção que é passada para a ferramenta para dizer o que fazer. Nesse caso em particular, está dizendo à ferramenta que tipo de arquivo de log /tmp/client.log é.

  • /tmp/client.log é obviamente o arquivo de log.

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 é o intervalo de datas do registro que você deseja verificar

  • "INFO" é uma das seqüências de caracteres que estão nas linhas de logs nas quais você está interessado.

  • "a2ensite" é outra string na mesma linha em que você espera encontrar a string "INFO". A especificação dessas duas strings (INFO e a2ensite) isola e processa as linhas que você deseja muito mais rapidamente, principalmente se estiver lidando com um grande arquivo de log.

  • 5 especifica Aviso. Ao especificar 5, você está dizendo ao programa para alertar como WARNING se houver pelo menos 5 ocorrências das cadeias de caracteres de pesquisa que você especificou

  • 10 especifica Crítico. Ao especificar 10, você está dizendo ao programa para alertar como CRÍTICO se houver pelo menos 10 ocorrências das sequências de pesquisa que você especificou.

  • -show especifica que tipo de resposta você receberá. Ao especificar -shown, você está dizendo que, se for encontrado algo que corresponda aos padrões especificados, envie para a tela.

Exemplo de execução:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

E se o período ou período de tempo especificado pelo usuário não estiver no log?

Cada execução do comando acima sempre terá uma linha (última linha da saída) que diz "ATWFILF" ou "ETWNFILF".

  • ATWFILF significa que o intervalo de datas ou o horário real que você solicitou pesquisar foram encontrados no log. Então isso é muito bom.

  • ETWNFILF significa que o intervalo de datas ou o período real que você solicitou a pesquisa NÃO foram encontrados no log. Nesse caso, o horário mais próximo do tempo especificado será detectado e usado.

SimplifiedWork
fonte