
Estou escrevendo um programa de script de shell para extrair algumas exceções de um arquivo de log e fazer algum processamento. Atualmente estou usando o comando abaixo em meu script para capturar a linha nos no arquivo de log que contém uma exceção. As linhas de exceção conterão ERROR
a palavra-chave logo após a data e o carimbo de data/hora
lineNos=($(grep -n ERROR $file | grep Exception | cut -d':' -f1 | tail -3))
Ao testar o script atual, percebi que algumas entradas de log contêm ERRO e Exceções na mesma linha, mas esse não é realmente o tipo de ERRO que estou procurando (exemplo linha 5). Gostaria de modificar meu script dessa maneira que retornará apenas a linha nº 3 no log de exemplo abaixo.
2016-10-21 15:25:37,231 INFO Processinng current row
2016-10-21 15:25:37,231 INFO com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 ERROR com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 DEBUG com.test.main com.test.controller.CrashException:
2016-10-21 15:25:37,231 DEBUG Processing row with ERROR and Exception
2016-10-21 15:25:37,231 DEBUG processed row 1:
Responder1
Se você quiser obter as linhas com as palavras ERROR
e Exception
, tente:
grep -E "ERROR.*Exception" $file
Responder2
Se você usar awk
no lugar de grep
, você não poderá imprimir apenas os números das linhas (mais precisamente,números recordes) diretamente, mas também testa campos específicos delimitados por espaços em branco individualmente, por exemplo
awk '$3 == "ERROR" && /Exception/ {print NR}' logfile
ou (ainda mais especificamente - limitando a partida Exception
ao campo final)
awk '$3 == "ERROR" && $NF ~ /Exception/ {print NR}' logfile
Responder3
cat thelogfile.log | nl -ba | grep "ERROR"
Isso canalizará o arquivo para nl para numerar linhas e, em seguida, filtrará com grep para linhas de erro. se você quiser apenas os números das linhas de erro, adicione awk '{print $1}'. Cat também pode alinhar números com o sinalizador -n, mas eu prefiro nl.
exemplo para uma variável de array de números de linha com erros;
linenos=($(cat -n thelogfile.log | grep "ERROR" | awk '{print $1}' | tr "\n" " " | sed 's/$/\n/'))
Editar:
ps o grep pode ser;
grep ",[0-9]* ERROR"
Responder4
Usando regex mais específico:
grep '^[0-9, :-]\+ERROR' "$file"