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:
- O arquivo de log ou diretório de log a ser monitorado
- 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
- As strings / padrões que você deseja observar
- 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
- 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.
xargs
e a possibilidade de quebra severa de espaços em branco em nomes de arquivos quando você pode apenas usarfind . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
?