
我有一個文件,我們稱之為 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]
我試圖找到產生最頻繁的調試訊息的類別。
在這個例子中你可以看到FTPS文件和作業佇列是產生訊息的兩個類別。
我有這個
cat filename.log | sed -n -e 's/^.*\(DEBUG \)/\1/p' | sort | uniq -c | sort -rn | head -10
這將產生班級名稱並顯示最常見的班級(前 10 名)。
問題是這並沒有給我班上的人數FTPS文件為 4。
如何更改上面的命令以基本上說抓取 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
最後一個可以用 pure 來完成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
(注意:您還排序了兩次,這似乎沒有必要)
編輯:如果您不知道課程將持續多長時間,您可以添加額外的 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