
Eu tenho um arquivo, vamos chamá-lo de filename.log, nele tenho algo assim
(2014-11-18 14:09:21,766), , xxxxxx.local, EventSystem, DEBUG FtpsFile delay secs is 5 [pool-3-thread-7]
(2014-11-18 14:09:21,781), , xxxxxx.local, EventSystem, DEBUG FtpsFile disconnected from ftp server [pool-3-thread-7]
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File Process@serverStatus on exit - 113 [pool-3-thread-7]
(2014-11-18 14:09:21,798), , xxxxxx.local, EventSystem, DEBUG FtpsFile FTP File Process@serverStatus on exit - 114 [pool-3-thread-7]
(2014-11-18 14:09:21,799), , xxxxxx.local, EventSystem, DEBUG JobQueue $_Runnable Finally of consume() :: [pool-3-thread-7]
Estou tentando encontrar as classes que produzem as mensagens DEBUG mais frequentes.
Neste exemplo você pode verArquivo FTPseJobQueuesão duas das classes que produzem uma mensagem.
eu tenho isto
cat filename.log | sed -n -e 's/^.*\(DEBUG \)/\1/p' | sort | uniq -c | sort -rn | head -10
Isso produzirá o nome da turma e me mostrará as turmas mais frequentes entre as 10 primeiras.
O problema é que isso não me dá a contagem da turmaArquivo FTPscomo 4. Ele conta cada arquivo de log FtpsFile como uma entidade única diferente.
Como altero o comando acima para basicamente dizer pegue a primeira palavra após DEBUG e ignore o resto para sua contagem?
Idealmente, eu deveria obter 4 FtpsFile 1 JobQueue
Responder1
Com GNU
sed
:sed 's/.*DEBUG \(\w*\).*/\1/' | uniq -c 4 FtpsFile 1 JobQueue
Com
grep
:grep -Po 'DEBUG \K\w+' | uniq -c 4 FtpsFile 1 JobQueue
Com
awk
:awk '$6=="DEBUG"{print $7}' | uniq -c 4 FtpsFile 1 JobQueue
O último pode ser feito em pure awk
, mas por uma questão de similaridade eu canalizei para uniq
.
Responder2
Correção rápida - adicionei o seguinte comando cut para destacar esse campo:
[host:~]$ cat logfile | cut -d" " -f7 | sort | uniq -c | sort -rn | head -10
4 FtpsFile
1 JobQueue
Na minha ânsia pelo KISS, isso não se aplica a aulas com espaço no nome.
Responder3
Você pode usar awk(em vez de sed) para evitar olhar os campos antes daquele em que está interessado e, em seguida, cortar a seção que deseja ver:
[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | cut -c 1-15 | uniq -c | sort -rn | head -10
4 DEBUG FtpsFile
1 DEBUG JobQueue
(Nota: você também estava classificando duas vezes, o que parece desnecessário)
EDIT: Se você não sabe quanto tempo as aulas durarão, você pode adicionar um comando awk adicional (em vez de cut):
[hunter@apollo: ~]$ cat filename.log | awk -F, '{ print $6 }' | awk '{ print $1, $2 }' | uniq -c | sort -rn | head -10
4 DEBUG FtpsFile
1 DEBUG JobQueue