Analisando arquivos de log com sed -e. Precisa contar nomes de classes exclusivos

Analisando arquivos de log com sed -e. Precisa contar nomes de classes exclusivos

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

informação relacionada