在運維工做中,要常常分析後臺系統的日誌,經過抓取日誌中的關鍵字信息,對抓取結果進行統計,從而爲監控結果提供基礎數據。
下面的shell演示瞭如何從大量的日誌中取得想要的統計結果。其中展現了各類有趣的命令和shell的用法。
具體功能就是統計出某個關鍵字在不一樣時段的出現次數。結果格式爲「HH 次數」
shell
#!/bin/sh # 取得YYYYMMDD格式的日期,以肯定所要抓取的日誌文件範圍 current_date=`date "+%Y%m%d"`; # 拼接組成須要抓取的日誌文件名稱 file_name=$current_date"*all*"; # 在一批日誌文件中查找某個關鍵字,並將查找結果造成一個臨時文件。 # 臨時文件的結果格式爲:文件名:日誌內容 #./pmclog/20171020_all_000000.log:00:00:00.876652|D|38|0327|get|CAccumulate.cpp|delete main grep 'delete main' ./pmclog/$file_name >> term_del.log; # 從臨時文件中取得時段信息,該信息是原始日誌內容的前兩個字符,並將結果保存到臨時文件中 # 若是須要其餘信息,那麼就須要修改awk的命令參數了。 awk -F ':' '{print $2}' term_del.log >> term_del_hour.log; rm term_del.log; rm term_del_hour_times.log; # 取得當前的時段 hour=`date "+%H"`; # 使用循環,對今天的每一個時段進行統計 for(( i=0; i<= $hour; i++)) do # 做爲數字的時候,變量i的前面是沒有0的,這裏要格式化出來一個0來,0點就是「00」,這樣能夠與臨時文件中的信息相匹配 hour2=$(printf '%02d' $i); # 使用 grep -o 和 wc -l的結合操做,就能夠統計一個特定字符在文件中出現的次數。 # 在前面使用echo 能夠標記出來每個次數是哪一個時段的數據 # 最終的term_del_hour_times.log就是最終的結果文件。 echo $hour2 `grep -o $hour2 term_del_hour.log | wc -l` >> term_del_hour_times.log; done; rm term_del_hour.log ;
------------------------------------------------bash
另一種簡潔的用法運維
經過一個關鍵字對日誌進行分析統計
在全部的文件中找「send ok」
grep 'send ok' 20171022*all* | more
輸出的結果爲:
20171022_130.76.0.145.31151_all_000000.log:00:02:16.989944|D|GGSN7.ocs1;1508598098;38971070;09566300|15537090456|34|0525|Send|Session.cpp|send ok
經過對上面的查詢結果進行分析,獲得一些有意義的次數統計。日誌
命令的意思就是,首先以「|」分割,取得查詢結果中的第三列,而後,再以「.」分割,取得結果中的第一列,最後,經過排序,統計每一個字符的次數。
grep 'send ok' 20171022*all* | awk -F "|" '{print $3}' | awk -F '.' '{print $1}' | sort | uniq -c | more
100 GGSN7
99 GGSN8blog