Use awk
e :
como o delimitador de campo. Em seguida, você pode salvar cada mensagem de erro exclusiva (que será o sexto campo) em uma matriz e imprimir somente a primeira ocorrência:
$ awk -F: '!a[$6]++' file
Dec 9 07:24:02 94.15.218.140 syslog: ssk:548.049:is_dns_hijack:1451:isDnsHijack=0
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.218:cmsLck_releaseLockTraced:144:lock hold time=0ms, acquiring lock callerFuncName is_dns_hijack; releasing lock callerFuncName is_dns_hijack;
Dec 9 07:24:10 90.192.172.112 syslog: ssk:363.217:cmsLck_acquireLockWithTimeoutTraced:98:acquired lock. callerFuncName is_dns_hijack; timeout 12000 milliseconds
O script acima salvará cada linha como uma entrada na matriz associativa a
somente se ainda não houver um valor salvo para o 6º campo ( !a[$6]
). Como a ação padrão em awk
é imprimir quando algo é avaliado como true, isso resultará apenas nas primeiras ocorrências exclusivas sendo impressas.
Se você quiser fazer isso apenas para linhas que correspondam a dns
, use:
awk -F: '!a[$6]++ && /dns/' file
Quanto a ignorar as 11 primeiras linhas, você pode fazer isso com:
grep dns file | tail -n +12