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).
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.
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.
^[^ ]+
parte ..Por que se preocupar em usar grep? Você pode simplesmente usar sed.
exemplo:
Isso imprimirá todos os logs entre
June 17 13:39:54
eJune 18 10:50:28
fonte
Na verdade, há uma maneira muito mais fácil de fazer isso.
Download / Documentação: autodrgrep.kl.sh
Comando:
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:
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.
fonte