Tenho um conjunto de arquivos de log que preciso revisar e gostaria de pesquisar strings específicas nos mesmos arquivos de uma só vez. Isso é possível? Atualmente estou usando

grep -E "fatal|error|critical|failure|warning|" /path_to_file 

Como faço para usar isso e pesquisar as sequências de vários arquivos de uma vez? Se isso é algo que precisa de um script, alguém pode fornecer um script simples para fazer isso?

Resposta

grep -E "fatal|error|critical|failure|warning|" *.log 

Comentários

  • Como faço para grep pular diretórios, mas ainda verificar todos recursivamente arquivos? grep -E 'text' **/* funciona, mas dá uma mensagem de erro para cada subdiretório (e então verifica corretamente todos os arquivos neles)
  • @Jorn, realmente você deve fazer uma nova pergunta, mas use find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
  • Eu obtive grep: invalid max count, então usei a resposta jherrans

Resposta

Você poderia usar algo assim:

find . -name "*.log" | xargs grep -E "fatal|error|critical|failure|warning|" 

Isso irá encontre todos os arquivos com .log como extensão e aplique o comando grep.

Comentários

Resposta

Se for é mais simples, você pode apenas especificar cada arquivo um após o outro.

grep -E "fatal|error|critical|failure|warning" file1.log file2.log 

Resposta

Se você precisar para usar grep em um conjunto arbitrário de nomes de arquivo que não podem ser recuperados por uma expressão regular:

grep -E "fatal|error|critical|failure|warning|" `cat<<FIN > file1 > file2 > ... > filen > FIN` 

Qual é a vantagem de colar os nomes dos arquivos um após o outro? Você pode compilar a lista de nomes de arquivo em um arquivo de texto e, em seguida, colá-la.

Resposta

Você também pode usar chaves se os arquivos estão todos na mesma pasta.

Veja um exemplo

grep -E "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg} 

Se você adicionar um s ao grep, isso suprime os erros de falta arquivos

grep -sE "fatal|error|critical|failure|warning|" /var/log/{messages,secure,syslog,dmesg} 

Eu estava experimentando isso sozinho para fazer comandos que funcionam em várias distros onde estão em um arquivo em relação ao outro devido a diferenças de sistema operacional.

Registros de correio

sudo grep -is [email protected] /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog} 

Registros de correio arquivados usando 2> / dev / null para suprimir avisos zgrep ausentes .gz

sudo zgrep -is [email protected] /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null 

Referência: Existe uma maneira de se referir a vários arquivos em um diretório sem redigitar todo o caminho?

Resposta

Se você deseja pesquisar recursivamente em arquivos de subdiretórios também, então você pode usar o comando abaixo

Ele irá pesquisar recursivamente no arquivo de subdiretórios s também

egrep -r "string1|string2" pathname 

Comentários

Resposta

Esta era uma tarefa que consumia muito tempo. E sim, certamente precisava de um script se você fosse procurar várias strings em vários logs diferentes ao mesmo tempo. Mas recentemente tive que fazer isso e foi muito doloroso. No entanto, está feito e pronto e pode ser baixado do seguinte link:

Download do script de pesquisa de registro

A maneira como isso funciona é muito simples.

Cenário 1: Monitore UMA string em apenas UM arquivo de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open" "." 1 2 single_errCheck -ndshow 

Cenário 2: Monitore VÁRIAS strings em apenas UM arquivo de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_errCheck -ndshow 

Cenário 3: Monitore strings únicas / múltiplas em vários arquivos de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 multi_err_multi_logCheck -ndshow 

Observações:

O _P_ significa OU – Substitui o tubo “|” s ymbol porque é menos provável que você “tenha que procurar uma string contendo” _P_ “. Se você não deseja digitar “_P_”, você pode simplesmente substituir o _P_ por “|”.

Ao usar este script, os parâmetros que você “mudará com frequência são:

  1. O arquivo de log ou diretório de log a ser monitorado
  2. A idade um arquivo de log deve ser para ser monitorado … isto é, não monitore ou descubra qualquer arquivo de log que tenha um carimbo de data / hora superior a 60 minutos
  3. As strings / padrões que você deseja observar
  4. A tag – este é o penúltimo argumento que você deve fornecer. Ela registra estatísticas sobre o (s) arquivo (s) de log que você está monitorando em / var / tmp / logXray
  5. A opção de log -ndshow – Este é o parâmetro que você deseja usar se deseja gerar as entradas dos logs encontrados que correspondem ao (s) padrão (ões) especificado (s).Se você apenas deseja ver a contagem total de cada padrão encontrado, simplesmente substitua “-ndshow” por “-ndfoundmul”.

Ao usar “-ndfoundmul”, você “obterá uma saída semelhante a:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m "can.*t.*open_P_ntpd.*stat" "." 1 2 blahblahA -ndfoundmul OK: [/var/log/messages][1] /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

Solução para o problema do pôster original: Procure várias strings em vários arquivos de registro

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m "fatal_P_error_P_critical_P_failure_P_warning" "." 1 2 multierr_logCheck -ndshow 

SOs: Isso foi testado no Ubuntu e Red Hat

Resposta

grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto 

Isso pesquisará por “fatal ou erro ou crítico ou falha ou aviso ou string de pesquisa” nos arquivos com o nome começando com “log_file?” e a extensão “lo ” * no caminho / path / to / the / file / e fornece à string de pesquisa uma cor aleatória e um número de linha de impressão em que foi encontrado.

Comentários

  • Claro, esta é uma resposta funcional, mas o usuário pediu para pesquisar usando um padrão, você respondeu usando uma string de pesquisa fixa. Desculpe, mas adicionar coisas que não foram solicitadas, como a numeração das linhas e a coloração dos resultados, provavelmente não tornará uma resposta mais benéfica. Mas haverá outras perguntas que provavelmente podem ser respondidas por suas grep habilidades, então boa sorte em sua carreira de USE!
  • @zagrimsan ponto tomado, I ‘ adicionamos o -E ‘ erro fatal | crítico | falha | aviso | ‘ param para isso.
  • E hey, ele pediu especificamente vários arquivos, não um padrão de pesquisa. Leia a pergunta novamente.
  • Citação da Q: ” strings específicas de pesquisa “, e a pergunta mostra o padrão de pesquisa (contendo várias strings para correspondência) que ele usa. Você está certo ao dizer que o título da pergunta está um pouco diferente do que ele realmente está pedindo. BTW, -E e -F podem ‘ ser usados ao mesmo tempo, eles são conflitante (erro de digitação?).

Resposta

JigarGandhi “s resposta demonstra o uso do caractere curinga asterisco. Existem mais deles e você pode vê-los aqui ou executando man 7 glob.

Um deles que achei útil é a correspondência de intervalo com []. Uma vez que o sistema em que trabalho produz um registro numerado sequencialmente arquivos, por exemplo, product.log.1 product.log.2 ... product.log.200 , é útil fazer um grep com um único comando em 3 ou 4 arquivos sequenciais, mas não mais. Portanto, este

grep "whatever" product.log.[5-7]

fará um grep para todos os arquivos que terminam com product.log. 5, 6 ou 7. O curinga não é necessário estar no final para que flickerfly “a resposta possa ser simplificada para

grep -E "fatal|error|critical|failure|warning" file[1,2].log

Observe também que esses curingas podem ser usados em outros comandos, bem como em cp por exemplo.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *