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

20

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

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

Como faço para grep este arquivo e obtenho somente as linhas apenas das 8h às 23h?

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

    
por Rosdi 21.06.2012 / 12:54

3 respostas

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

Uma explicação detalhada pode ser encontrada em vários tutoriais regex (expressão regular); egrep usa a sintaxe "POSIX estendida" ( man 7 regex ).

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

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

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

    • + significa "um ou mais do anterior" (por exemplo, a+ corresponderia a a , aaa e aaaaaaaa ).

    • Portanto, ^[^ ]+ começará com o início da linha e corresponderá a tantos caracteres não espaciais quanto possível.

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

Uma opção um pouco melhor é:

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

A opção -F divide cada linha em campos separados de acordo com a [: ] regex (correspondente a : ou um espaço) e o script awk verifica a segunda coluna (a hora ).

    
por 21.06.2012 / 13:08
18

Por que se preocupar em usar o 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 registros entre June 17 13:39:54 e June 18 10:50:28

    
por 21.06.2012 / 13:11
0

Na verdade, existe 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 passada para a ferramenta para informar o que fazer. Neste caso particular, está dizendo à ferramenta que tipo de arquivo de log /tmp/client.log é.

  • /tmp/client.log é, claro, o arquivo de log.

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

  • "INFO" é uma das strings que estão nas linhas de registro em que você está interessado.

  • "a2ensite" é outra string na mesma linha na qual você espera encontrar a string "INFO". Especificar essas duas cadeias de caracteres (INFO e a2ensite) isola e processa as linhas que você deseja muito mais rapidamente, principalmente se estiver lidando com um arquivo de log enorme.

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

  • 10 especifica crítico. Ao especificar 10, você está dizendo ao programa para alertar como CRITICAL se houver pelo menos 10 ocorrências das strings de pesquisa que você especificou.

  • -show especifica que tipo de resposta você receberá. Ao especificar -shown, você está dizendo que, se algo for encontrado que corresponda aos padrões especificados, a saída será exibida na tela.

Execução de amostra:

# ./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 intervalo de datas ou o intervalo de tempo especificados pelo usuário não estiverem 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 período ou intervalo de tempo real que você solicitou pesquisado foi encontrado no log. Então isso é muito bom.

  • ETWNFILF significa que o período ou intervalo de tempo real que você solicitou pesquisado NÃO foi encontrado no log. Nesse caso, o horário mais próximo do horário especificado será detectado e usado em seu lugar.

por 09.05.2016 / 08:43

Tags