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

57

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 faço para usar isso e procurar as seqüê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?

user53029
fonte
2
greppode levar mais de um argumento de arquivo.
Jw013

Respostas:

61
grep -E 'fatal|error|critical|failure|warning|' *.log
JigarGandhi
fonte
Como faço greppara pular diretórios, mas ainda verificar recursivamente todos os arquivos? grep -E 'text' **/*funciona, mas dá uma mensagem de erro para cada subdiretório (e, em seguida, verifica corretamente todos os arquivos neles)
Jorn
4
@Jorn, realmente você deve fazer uma nova pergunta, mas usarfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard
20

Você poderia usar algo como isto:

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

Isso encontrará todos os arquivos com .logextensão e aplicará o grepcomando

jherran
fonte
Isso foi muito fácil :) Na verdade todos os meus arquivos são .log tão "grep -e 'fatal | erro | crítica | fracasso | aviso' * .log funciona muito obrigado.!
user53029
11
Que grande esforço de compreensão / adaptação, usuário53029!
Gilles Quenot
11
Por que se preocupar xargse a possibilidade de quebra grave no espaço em branco nos nomes de arquivos quando você pode apenas usar find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
Curinga
16

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

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 
flickerfly
fonte
2
Tão simples, mas estava procurando isso por muito tempo: 0
Adam Hughes
3

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.

Diego Pino
fonte
1

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
Praveen Kumar BS
fonte
11
sobre egrep
Jeff Schaller
0

Esta foi uma tarefa muito demorada. E sim, certamente precisava ser roteirizado para procurar várias seqüências de caracteres 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: monitore 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: Monitorar 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 tubo "|" símbolo porque é menos provável que você tenha que procurar por uma string contendo "_P_". Se você não deseja digitar "_P_", basta 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.
  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:

[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 seqüências 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

Nagios Monitoring
fonte
0
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 com 'log_file?' e a extensão 'lo ' * no caminho / caminho / para / o / arquivo / e dê à sequência de caracteres de pesquisa uma cor aleatória e o número da linha de impressão em que foi encontrado.

Obaid
fonte
Claro que essa é uma resposta funcional, mas o usuário solicitou a pesquisa usando um padrão, você respondeu usando uma sequência de pesquisa fixa. Desculpe, mas adicionar coisas que não foram solicitadas, como a numeração de linhas e a coloração dos resultados, provavelmente não tornará uma resposta mais benéfica. Mas haverá outras perguntas que provavelmente poderão ser respondidas com suas grephabilidades, para que você tenha muita sorte em sua carreira na USE!
Zagrimsan 8/08
@zagrimsan apontado, adicionei -E 'fatal | erro | crítico | falha | aviso |' param para isso.
Obaid
E, ei, ele pediu especificamente vários arquivos, não um padrão de pesquisa. Por favor, leia a pergunta novamente.
Obaid
Cite o Q: "pesquisar cadeias específicas" e a pergunta mostra o padrão de pesquisa (contendo várias cadeias para correspondência) que ele usa. Você está certo que o título da pergunta está um pouco diferente do que ele realmente está pedindo. Entre, -Ee -Fnão podem ser usados ​​ao mesmo tempo, eles são conflitantes (erro de digitação?).
zagrimsan
0

A 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 eu achei útil é o intervalo correspondente []. Como o sistema em que trabalho produz arquivos de log numerados sequencialmente product.log.1 product.log.2 ... product.log.200, por exemplo , é ú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 no final, portanto a resposta do flickerfly pode 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, como também, cppor exemplo.

Stelios Adamantidis
fonte
0

Você também pode usar chaves se os arquivos estiverem 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 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?

Mike
fonte