使用 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] 

我試圖找到產生最頻繁的調試訊息的類別。

在這個例子中你可以看到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

相關內容