
У меня есть файл, назовем его 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