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

Анализ файлов журнала с помощью 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.

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

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

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

Это выведет название класса и покажет мне самые часто используемые классы в виде 10 лучших.

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

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

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

решение1

  • С 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.

решение2

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

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

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

решение3

Вы можете использовать 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 (вместо 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

Связанный контент