菜鳥擁抱AWK(一)

       大家好,我是小菜鳥M,今天是寫完的程序在新設備上壓力測試的最後一天,程序一直沒什麼異常,作爲一個菜鳥雖然心裏不斷告誡自己測試報告纔是重中之重,但實際上心裏還是蠻爽的,這時BOSS走了過來。

    “老大,這輪24小時壓力快跑完了,這次修改完的版本沒什麼問題。”

    “恩,好,測試報告出來下班前發給我吧,svn上有以前測試報告的模板,自己看一下,不懂的問一下組長。”

    “組長,這個丟失率是怎麼分析出來的啊?”

    “這個,你用AWK分析日誌,找出觸發點的數目,在與壓力測試程序給出的發生數目報告和設備日誌中的數目報告做分析就得出來了。”

    “這個AWK。。。。。。內事問BAIDU,外事問GOOGLE。”

      菜鳥M我沒接觸過AWK啊!!!!!~~~~~於是我埋頭投入到AWK的學習中,在我查看AWK的使用手冊的時候,BOSS走了過來“測試報告儘快給我哦~”,這樣看來按照現在的進度很難在規定的時間內完成,那麼考驗我外功的時刻到來了,頓時內心狂熱地燃燒“Come on,Mission Complete”。

      那麼我先看日誌的結構,一個好的日誌是要記錄進入關鍵方法的信息,同時要有良好的結構,關於日誌記錄的關鍵點在這裏先不說了,那麼先看某段日誌如下

2011-06-22 15:26:00 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 53 TS = 16 [8a 91 10 85 01 00 00 00 00 00 0d 0d 00 0c 02 00 02 82 90 33 5b ]
2011-06-22 15:26:00 INFO  psr E1 = 53 TS = 16 [84 8d] [0c] [9999_6000_13] stop record
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(cic=13|boadr=0|chan=0|ts=13|stype=3|caller=9999|called=6000|oricalled=888888|uuin=7299773804736151556|9999|888888): ThreadId [6644].
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(): replace uuin_CustDN [888888] for ori [888888].
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(): uuin_CustDN [888888].
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(): tranfer[888888]. 
2011-06-22 15:26:00 INFO  psr DSPChannelManager::getDtiCh, DTI [0:0:13]
2011-06-22 15:26:00 INFO  psr ISX_dx_stopch success, DSP [0:1:012]
2011-06-22 15:26:00 INFO  psr JobStandardSignalProcess::processDropSignal: record(cic=13|chan=0|ts=13|caller=9999|called=6000|filename=Record/20110622/15/20110622152554_13_888888_6000.wav) stops.
2011-06-22 15:26:00 INFO  psr JobStandardSignalProcess::ctiAdapter_getCallInfo: getCallInfo(1) callInfo=9999|6000|888888.
2011-06-22 15:26:00 INFO  psr ISX_sr_getevtoperindex() = [1]
2011-06-22 15:26:00 INFO  psr TDX_RECORD DSP DSP [0:1:012] CIC [13] AsyInvkId [1] Function Stopped by User
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(cic=13|boadr=0|chan=0|ts=13|stype=4|caller=|called=|oricalled=|uuin=7299773804736151556|9999|888888): ThreadId [6644].
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(): replace uuin_CustDN [888888] for ori [].
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(): uuin_CustDN [888888].
2011-06-22 15:26:00 DEBUG psr JobStandardSignalProcess::handle(): tranfer[888888].
2011-06-22 15:26:00 INFO  psr JobStandardSignalProcess::ctiAdapter_notifyRecordFinished: notifyRecordFinished(1,Record/20110622/15/20110622152554_13_888888_6000.wav,6) isOk=0.
2011-06-22 15:26:00 DEBUG psr JobRecordFileOutput::handle(Record/20110622/15/20110622152554_13_888888_6000.wav|1308727554|1308727560|9999|6000|888888)
2011-06-22 15:26:00 INFO  psr insert into recordfile(filename,createtime,status,privatedata)success values ('Record/20110622/15/20110622152554_13_888888_6000.wav','2011-06-22 15:25:54',1,'9999|6000|888888');
2011-06-22 15:26:00 DEBUG psr SingalStreamReactor::run(10): M_OS::recv() = 27. 
2011-06-22 15:26:00 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 52 TS = 16 [91 8b 0c 85 00 00 00 01 00 00 0d 0d 00 10 00 5f f5 ]
2011-06-22 15:26:00 DEBUG psr SingalStreamReactor::run(10): M_OS::recv() = 31. 


       上面是需要分析的日誌的一段截取,我關心的是在一組16進制數值中特定位置上特定16進制數值的數目,日誌文件名命名規則爲psr.log.n(n爲整數),以50m大小作爲分頁依據,那麼小M我是這樣分析的:

       我關心的只是有關16進制數值的內容,那麼我是否可以先把我需要的單行日誌截取出來放在新的文件中以供後續分析呢,我需要的行形式如下所示

2011-06-22 15:26:00 INFO psr StreamSS7Parse::ss7_msu_process: E1 = 53 TS = 16 [8a 91 10 85 01 00 00 00 00 00 0d 0d 00 0c 02 00 02 82 90 33 5b ]

       特定內容日誌輸出需要有唯一性,於是我把StreamSS7Parse::ss7_msu_process作爲檢索的關鍵字,AWK代碼如下

awk '/StreamSS7Parse::ss7_msu_process/{print $0}' psr.log* > temp1

注意:這裏我創建了一個temp1.awk的文件,保存上訴內容後,記得把它權限變爲可執行文件哦chmod u+x temp1.awk

          運行時./temp1.awk

       查看temp1如下:

2011-06-22 15:08:18 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 53 TS = 16 [d0 dd 3f 85 01 00 00 00 00 00 05 05 00 01 00 00 00 f8 00 02 06 04 01 90 06 00 0a 04 01 13 99 99 28 04 01 14 08 00 20 1e 04 37 32 39 39 37 37 33 37 38 37 30 31 39 34 31 31 34 35 38 7c 39 39 39 39 7c 38 30 30 30 00 2b b8 ]
2011-06-22 15:08:18 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 52 TS = 16 [dd d1 0e 85 00 00 00 01 00 00 05 05 00 06 04 00 00 5f eb ]
2011-06-22 15:08:18 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 52 TS = 16 [dd d2 0c 85 00 00 00 01 00 00 05 05 00 09 00 66 ee ]
2011-06-22 15:08:18 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 53 TS = 16 [d2 de 1e 85 01 00 00 00 00 00 06 86 00 01 00 00 00 f8 00 02 06 04 01 90 08 00 0a 04 01 13 06 00 00 2a 76 ]
2011-06-22 15:08:18 INFO  psr StreamSS7Parse::ss7_msu_process: E1 = 52 TS = 16 [de d3 0e 85 00 00 00 01 00 00 06 86 00 06 04 00 00 ce 6e ]


       這時可以看到此文件已經把所有無關的日誌行全部濾除掉了,那麼接下來就是分析特定位置的數值了,特定位置我已經標註了出來,即一串數值的的十四個,按照第一步的操作,我的思路還是把特定位置的特定數值全部提取出來把它打印到新的文件中,那麼AWK有沒有對單行日誌做匹配的東西,答案很顯然我就不說啦,O(∩_∩)O哈哈~

       用AWK默認的分隔符,和日誌中特定字符作爲分隔符,這裏用'[',分隔後27域就是我想要的內容(關於域的概念後續再提),AWK代碼如下

awk -F "[ '[']" '{print $27}' temp1 > temp2


 

       得到的temp2如下所示:

09
01
06
09
0c
10
0c
10
4c
4c
4c
4c
4c
4c
4c
4c
4c


 

       很順利地得到了自己想要計數的內容,最後的步驟就是計算有用的關鍵字即可,那麼AWK能不能夠有專門計數的模式或者內嵌方法呢,答案是肯定的,代碼如下

#!/bin/awk -f

#name:analysis.awk

#to call:analysis.awk psr.log

#loops through the psr.log file and counts how many 01 06 07 09 0c 10 we have in log

#start of BEGIN
BEGIN{
analysis["01"]
analysis["06"]
analysis["07"]
analysis["09"]
analysis["0c"]
analysis["10"]
#end of BEGIN
}

{for (number in analysis)
{if($0==number)
analysis[number]++}}
END{for (number in analysis )print "The Log has ",analysis[number],number,"times"}


 

       其中可以看到,我想計數的關鍵字爲"01"、"06"、"09"、"0c"、"10",運行後在屏幕上輸出

The Log has  782028 09 times
The Log has  794189 0c times
The Log has  782457 10 times
The Log has  782021 01 times
The Log has  782077 06 times
The Log has   07 times


 

       以上就是我想要得到的關鍵數值的數目,就可以與壓力測試程序給出的發生數目報告和設備日誌中的數目報告相結合統計丟失率了。

      終於在規定的時間完成了測試報告,小M我不禁鬆了口氣,整個過程是很緊湊的,幾乎沒什麼時間思考,回家轉念一想,自己實現的是如此簡陋還分出三個awk文件來作分析,首先三個必定可以合併爲一個文件,同時也不需要產生過渡性的文件,計數的實現應該可以更簡化,菜鳥M我決定要回過頭來好好掌握一下AWK,不然以後可是有的蛋疼。

       這一階段就告一段落嘍,歡迎大家的收看~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章