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

5

Eu tenho um arquivo, vamos chamá-lo filename.log, nele eu tenho algo parecido com isto

(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 ver FtpsFile e JobQueue duas das classes que produzem uma mensagem.

Eu tenho isso

cat filename.log | sed -n -e 's/^.*\(DEBUG \)//p' | sort | uniq -c | sort -rn | head -10

Isso produzirá o nome da classe e mostrará as classes mais frequentes como um dos 10 melhores.

O problema é que isso não me dá a contagem da classe FtpsFile como 4. Ele conta cada arquivo de log do FtpsFile como uma entidade única diferente.

Como eu mudo o comando acima para basicamente pegar a primeira palavra após o DEBUG e ignorar o resto para sua contagem?

Idealmente eu deveria ter 4 FtpsFile 1 JobQueue

    
por wiredniko 18.11.2014 / 21:38

3 respostas

2
  • Com o GNU sed :

    sed 's/.*DEBUG \(\w*\).*//' | 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 awk puro, mas por uma questão de similaridade eu canalizei para uniq .

    
por 18.11.2014 / 21:59
1

Correção rápida - adicionei o seguinte comando de corte para destacar esse campo:

[host:~]$ cat logfile | cut -d" " -f7 | sort | uniq -c | sort -rn | head -10
      4 FtpsFile
      1 JobQueue

Na minha ânsia por K.I.S.S., isso não se aplica a classes com um espaço no nome.

    
por 18.11.2014 / 21:45
0

Você pode usar o awk (em vez de sed) para evitar olhar para os campos antes daqueles 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 classes serão, você pode adicionar um comando awk adicional (ao invés de cortar):

[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
    
por 18.11.2014 / 21:47