Encontre os números das linhas de exceção no arquivo de log

Encontre os números das linhas de exceção no arquivo de log

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 ERRORa 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 ERRORe Exception, tente:

grep -E "ERROR.*Exception" $file

Responder2

Se você usar awkno 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 Exceptionao 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"

informação relacionada