contar mensagens de erros em um arquivo de log

contar mensagens de erros em um arquivo de log
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:1
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:2
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:5
java.lang.NullPointerException:12
java.lang.NullPointerException:7
java.lang.NullPointerException:18
java.lang.NullPointerException:2 

Como você pode ver, tenho 3 erros de mysql duplicados e sua frequência aparece no final. No primeiro erro aparece 1, no segundo erro aparece 2 e na terceira vez aparece 5. Quero que o script permaneça uma linha duplicada com soma. Fazendo o mesmo para os erros de java.

Resultado esperado:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Out of range value for column 'current_state' at r:8
java.lang.NullPointerException:39

Responder1

awk 'BEGIN{ FS=OFS=":" }
   { freq=$NF; sub(/:[^:]*$/, ""); seen[$0]+=freq }
END{ for (x in seen) print x, seen[x] }' infile

FS é o separador de campos de entrada e OFS é o separador de campos de saída; ambos definimos como dois pontos; então pegamos o último campo $NFem uma variável temporária freqe removemos o último campo do registro de entrada atual $0usando a função sub().

ao fazer isso, seen[$0]+=freqestamos somando as mesmas linhas de log (o último campo já está excluído) no valor do último campo conforme a frequência que mantemos na freqvariável anteriormente.

então, no FINAL, percorremos o array e imprimimos as linhas seguidas de sua frequência total.

informação relacionada