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

33

Eu tenho um conjunto de arquivos de log que preciso revisar e gostaria de pesquisar strings 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 pesquiso as sequências de vários arquivos de uma só vez? Se isso é algo que precisa ser roteirizado, alguém pode fornecer um script simples para fazer isso?

    
por user53029 03.12.2014 / 20:06

8 respostas

43

grep -E 'fatal|error|critical|failure|warning|' *.log
    
por 10.12.2014 / 06:54
13

Você poderia usar algo assim:

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

Isso localizará todos os arquivos com .log como extensão e aplicará o comando grep .

    
por 03.12.2014 / 20:13
10

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 
    
por 09.12.2015 / 20:32
2

Se você precisar aplicar 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 dos arquivos um após o outro? Você pode compilar a lista de nomes de arquivos em um arquivo de texto e depois colá-los.

    
por 12.08.2015 / 09:34
0

Esta foi uma tarefa muito demorada. E sim, certamente precisaria ser roteirizado se você for pesquisar várias strings em vários logs diferentes ao mesmo tempo. Mas recentemente tive que fazer isso e foi muito doloroso. No entanto, está pronto e pode ser baixado do seguinte link:

Download do script de pesquisa de log

A maneira como isso funciona é bem simples.

Cenário 1: monitore uma string 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 sequências de texto MULTIPLE 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: Monitore cadeias ú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 pipe "|" 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ê vai alterar com frequência são:

  1. O arquivo de log ou diretório de log a ser monitorado
  2. A idade que um arquivo de log deve ter para ser monitorado ... ou seja, não monitore ou descubra qualquer arquivo de log que tenha um registro de data e hora acima de 60 minutos
  3. As strings / padrões que você deseja assistir
  4. A tag - esse é o segundo ao último argumento que você precisa fornecer. Ele registra estatísticas sobre o (s) arquivo (s) de registro 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 especificados. Se você quiser apenas 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: Verificação de 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

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

Isto irá procurar '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 extensão 'lo ' * no caminho / caminho / para / o / arquivo / e dá à seqüência de pesquisa uma cor aleatória e o número da linha de impressão em que ela foi encontrada.

    
por 08.08.2017 / 09:40
0

A resposta de JigarGandhi demonstra o uso do curinga asterisco. Há 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 eu trabalho produz arquivos de log sequencialmente numerados, por exemplo, product.log.1 product.log.2 ... product.log.200 , é útil usar um único comando em 3 ou 4 arquivos sequenciais, mas não mais. Então isso

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

irá grep para todos os arquivos terminados em product.log. 5, 6 ou 7. O curinga não é necessário no final, então a resposta da 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, assim como em cp , por exemplo.

    
por 26.01.2018 / 16:17
0

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

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

egrep -r "string1|string2" pathname
    
por 26.01.2018 / 17:03