使用 awk 命令統計文字

程式設計師小航發表於2022-05-24
2022-04-19 11:25:15.008,b4d13bfca8fe4b93a85e65a88520d945,LogScheduler#printLog,10ms,Y,xxxxxxxx
2022-04-19 12:01:15.002,4d10d093dce8491c8ae3c1bff6dbd7c5,LogScheduler#printLog,999ms,N,xxxxxxxx
2022-04-19 12:12:16.003,d9d1f4b121764edb8cb260417cd75229,LogScheduler#printLog,5ms,Y,xxxxxxxx
2022-04-19 12:15:22.004,e3e10340e51c49ce9d688541ba799283,LogScheduler#printLog,1001ms,N,xxxxxxxx
2022-04-19 12:55:59.005,209d2f1407894da5aa0f44de621515c7,LogScheduler#printLog,1020ms,Y,xxxxxxxx
2022-04-19 13:25:15.006,e09f75c6d0d849068ae713820c94f3f9,LogScheduler#printLog,15ms,Y,xxxxxxxx
2022-04-19 13:25:15.008,b4d13bfca8fe4b93a85e65a885231231,LogScheduler#printLog,99ms,Y,xxxxxxxx

有那麼一段日誌,需要統計出來以下資訊:

  • 輸出耗時超過 1000ms 並且結果是 Y 的整行
  • 12:00 ~ 13:00 之間成功的行數,成功率

日誌格式:時間,traceId,類方法名,耗時,結果,內容

看到這裡,如果小夥伴已經有思路了,那就沒必要往下面看了,直接拉到最後,點贊、在看。

這裡要使用的就是 awk 命令。

常用內建變數

awk 的主要功能就是對文字進行統計報告,具體介紹可以看菜鳥筆記,下面僅介紹幾個常用的內建變數。

  • FS:行欄位分隔符,預設是空格,可以使用-F指定分隔符
  • $0、$1……:行欄位分隔符分割後獲取指定部分,$0 是獲取整行記錄
  • NF:當前行的欄位數量
  • RS:行記錄分隔符
  • NR:行號

大概常用的就這幾個,下面看一下實際使用效果

效果展示

notes  % > awk '{print $0}' c.log

因為 $0 就代表整行記錄,所以輸出結果如下。

那 $1 的結果呢?

因為預設是空格作為分隔符,所以輸出的結果就只有日期了。

指定分隔符為,之後,看一下輸出結果:

題目答案

基本上熟悉了怎麼使用剩下的就比較好辦了。

  • 耗時超過 1000ms 且 Y 的行
notes  % > awk -F ',' '{split($4,a,"ms"); if(a[1] > 1000 && $5 == "Y") print $0}' c.log

  • 12:00 ~ 13:00 之間成功的行數,成功率
awk -F ',' 'BEGIN{count=0;sum=0}{if($1>="2022-04-19 12:00:00.000" && $1<"2022-04-19 13:00:00.000"){sum+=1;if($5 == "Y")count+=1}}END{print NR,count,sum,count/sum}' c.log

總記錄 7 條, 12:00 ~ 13:00 之間成功的行數是 2,成功率 0.5。

總結

上面只是在工作中可能會遇到的一個場景,所以記錄下來,如果小夥伴有更合適的方式來統計計算,歡迎留言。

相關文章