Анализ файлов журнала с помощью sed -e. Нужно учитывать уникальные имена классов

У меня есть файл, назовем его filename.log, в нем у меня что-то вроде этого

(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] 

Я пытаюсь найти классы, чтобы производить наиболее частые сообщения DEBUG.

В этом примере вы можете видеть, что FtpsFile и JobQueue являются двумя классами, создающими сообщение.

у меня есть это

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

Это создаст имя класса и покажет мне наиболее частые классы в качестве топ-10.

Проблема в том, что это не дает мне счет класса FtpsFile как 4. Он подсчитывает каждый файл журнала FtpsFile как другой уникальный объект.

Как изменить команду выше, чтобы в принципе сказать, захватить первое слово после DEBUG и игнорировать остальные для вашего счета?

В идеале я должен получить 4 FtpsFile 1 JobQueue

  • С GNU sed :

     sed 's/.*DEBUG \(\w*\).*/\1/' | uniq -c 4 FtpsFile 1 JobQueue 
  • С grep :

     grep -Po 'DEBUG \K\w+' | uniq -c 4 FtpsFile 1 JobQueue 
  • С awk :

     awk '$6=="DEBUG"{print $7}' | uniq -c 4 FtpsFile 1 JobQueue 

Последнее можно сделать в чистом awk , но ради сходства я подал его на uniq .

Быстрое исправление. Я добавил следующую команду cut, чтобы выделить это поле:

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

В моем стремлении к KISS это не относится к классам с пробелом в имени.

Вы можете использовать awk (вместо sed), чтобы не смотреть на поля до того, что вас интересует, а затем разрезать раздел, который вы хотите увидеть:

 [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 

(Примечание: вы также сортировали дважды, что кажется ненужным)

EDIT: Если вы не знаете, как долго будут проходить классы, вы можете добавить дополнительную команду awk (вместо вырезания):

 [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