菜鸟拥抱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,不然以后可是有的蛋疼。

       这一阶段就告一段落喽,欢迎大家的收看~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值