Script que varre logs, coleta dados específicos e cria um diretório de saída

1

Eu tinha pedido um pergunta há algum tempo sobre como extrair informações específicas de um arquivo de log e obter algumas respostas úteis, mas eu ainda não tenho o que preciso. O que eu tenho até agora:

#!/bin/bash


mkdir result

cd $1
ls | while read -r file;
do
egrep "ERROR|FAIL|WARN" > ../errors-$file
done
cd ..

mv errors-* result

Aqui está o que eu quero no total: o script verifica através de um diretório de logs, pega cada linha de texto (alguns são multi-linha) que inclui ERROR | FAIL | WARN, e os envia em um diretório chamado "result" com cada arquivo individual sendo nomeado com base em seu arquivo de origem.

Funciona quando meu diretório de log de destino tem apenas um arquivo de texto, mas não funciona quando meu diretório de destino tem diretórios e arquivos de log em diferentes níveis dentro dele. Eu sei que é porque o bit "../errors-$file" no script, mas eu não sei como alterá-lo.

Qualquer ajuda seria ótima, e peço desculpas antecipadamente se estiver mal formulada.

    
por Patremagne 12.08.2016 / 19:46

1 resposta

0

Eu vou cutucar o seu próprio loop, e tentar entender o que ele está realmente fazendo, e então ver como você pode conseguir o que você quer.

Como você inicia seu loop é extremamente complexo: ls | while read -r file; . Você está canalizando os resultados de ls para seu while read , não é grande coisa, ainda funciona, embora eu recomende um loop for mais como:

for file in ./* ;

Isso fará um loop pelos mesmos arquivos, mas será um pouco mais direto. Além disso, o comando ls pode retornar a saída que não é apenas os nomes de arquivos (já note que ls tem cores de fonte diferentes para diretórios / executáveis?), E isso pode causar outros lamentos de comandos.

Seu comando: egrep "ERROR|FAIL|WARN" > ../errors-$file está tentando egrep para ERROR|FAIL|WARN em nada e redirecionando a saída para ../errors-$file .

A sintaxe para egrep é:

egrep [search pattern] [location]

Então, você está perdendo a localização para egrep procurar. Você pode corrigir isso adicionando $file após seu padrão, de modo que se torne:

#!/bin/bash


mkdir result

cd $1
for file in $(find ./ -type f)
do
egrep "ERROR|FAIL|WARN" $file > ../result/errors-$(basename $file)
echo "-------------------------------" >> ../result/errors-$(basename $file)
egrep "denied" -B 1 $file >> ../result/errors-$(basename $file)
done
    
por 12.08.2016 / 21:16