desenv-web-rp.com

Como grep para a mesma string, mas vários arquivos ao mesmo tempo?

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

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

Como eu uso isso e procuro as sequências de vários arquivos de uma só vez? Se isso é algo que precisa ser script, alguém pode fornecer um script simples para fazer isso?

66
user53029
grep -E 'fatal|error|critical|failure|warning|' *.log
68
JigarGandhi

Você poderia usar algo como isto:

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

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

23
jherran

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 
20
flickerfly

Se você precisar grep em um conjunto arbitrário de nomes de arquivos 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 de arquivos um após o outro? Você pode compilar a lista de nomes de arquivos em um arquivo de texto e colá-lo.

3
Diego Pino

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

Ele procurará recursivamente em arquivos de subdiretórios também

egrep -r "string1|string2" pathname
1
Praveen Kumar BS

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

Um deles que achei útil é o intervalo correspondente a []. Como o sistema em que trabalho produz arquivos de log numerados sequencialmente, por exemplo, product.log.1product.log.2...product.log.200, é útil grep com um único comando em 3 ou 4 arquivos seqüenciais, mas não mais. Então, é isso

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

grep para todos os arquivos que terminam com product.log. 5, 6 ou 7. O curinga não é necessário estar no final, então resposta do flickerfly pode ser simplificado para

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

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

0
Stelios Adamantidis

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

Download do script de pesquisa de log

A maneira como isso funciona é bem simples.

Cenário 1: Monitore UMA sequência em apenas um arquivo de log

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

Cenário 2: Monitora VÁRIAS seqüências de caracteres em apenas UM arquivo de log

./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: Monitora seqüências únicas/múltiplas em vários arquivos de log

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

Notas:

O _P_ significa OR - Substitui o símbolo de barra vertical "|" porque é menos provável que você precise procurar por uma string contendo "_P_". Se você não deseja digitar "_P_" , você pode simplesmente substituir o _P_ por "|".

Ao usar esse script, os parâmetros que você alterará com frequência são:

  1. O arquivo de log ou diretório de log a ser monitorado
  2. A idade em que um arquivo de log deve ser para ser monitorado. não monitore ou descubra nenhum arquivo de log que tenha um carimbo de data e hora superior a 60 minutos
  3. As seqüências/padrões que você deseja assistir
  4. A tag - este é o penúltimo argumento que você precisa fornecer. Ele 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 - Esse é o parâmetro que você deseja usar se desejar gerar as entradas dos logs encontrados que correspondem aos padrões que você especificou. Se você quiser apenas ver a contagem total de cada padrão encontrado, substitua '-ndshow' por '-ndfoundmul'.

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

[[email protected]]# ./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 por várias strings em vários arquivos de log

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

Sistemas operacionais: Isso foi testado no Ubuntu e Red Hat

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

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

0
Obaid

Você também pode usar chaves se os arquivos tiverem a 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 suprimirá erros sobre arquivos ausentes

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

Eu estava apenas experimentando isso sozinho para executar comandos que funcionam em várias distros, em um arquivo ou outro devido a diferenças no sistema operacional.

Logs de correio

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

Logs de correio arquivados usando 2>/dev/null para suprimir avisos do 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 o caminho inteiro?

0
mike