菜鸟拥抱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
    评论
<h3>回答1:</h3><br/>可以使用awk命令的$NF变量来截取文件的最后一列,具体命令如下: ``` awk '{print $NF}' 文件名 ``` 其中,$NF表示最后一列,print $NF表示输出最后一列的内容。文件名为需要截取的文件名。 <h3>回答2:</h3><br/>awk是一种用于处理文本文件的强大工具,在大型文件中对文本进行搜索和处理时尤为有用。其中,一个常见的操作是截取文件的最后一列。下面将详细介绍如何使用awk实现这个操作。 首先,让我们来看看一个示例文本文件,它的内容如下: ``` John,Smith,25 Mary,Zhang,33 David,Li,18 ``` 每行包含三个字段,分别是名字,姓氏和年龄,用逗号隔开。我们的目标是仅保留每行的最后一个字段,即年龄。这可以通过以下命令实现: ``` awk -F "," '{print $3}' file.txt ``` 在上面的命令中,“-F”选项表示指定分隔符,这里我们使用逗号作为分隔符。然后,“{print $3}”表示打印每行的第三个字段(即最后一个字段)。最后,我们指定要处理的文件名“file.txt”。 执行上述命令后,会输出以下结果: ``` 25 33 18 ``` 这就是我们想要的结果,即每行的最后一个字段。值得注意的是,awk默认使用空格作为分隔符,所以在使用逗号作为分隔符时,需要使用“-F”选项显式指定。 除了使用默认分隔符和指定分隔符外,我们还可以使用其他选项来截取最后一列。例如,“awk '{print $NF}' file.txt”表示打印每行的最后一个字段,不需要指定分隔符,系统会自动识别。 总之,使用awk截取文件的最后一列非常简单,只需掌握相应的命令和选项即可。在实际使用中,可以根据具体情况进行调整和优化,以满足不同的需求。 <h3>回答3:</h3><br/>awk是一种用于处理文本文件的命令。它可以按照指定的规则对文本进行处理,并输出指定的结果。在awk中,可以使用$符号来表示每一列,$0表示当前行,$1表示第一列,$2表示第二列,以此类推。如果要截取文件的最后一列,可以使用$NF来表示。 $NF表示最后一列,它的值是不固定的,因为每个行中最后一列的位置可能不同。如果要在awk中截取文件的最后一列,可以使用如下语句: awk '{print $NF}' filename 其中,filename是要处理的文件名。这条命令将输出文件中每一行的最后一列。 此外,如果需要对最后一列进行计算或比较,也可以使用如下语句: awk '{sum+=$NF} END {print sum}' filename 这条命令将对文件中每一行的最后一列进行求和,并输出结果。其中,$NF表示最后一列的值,sum表示求和的结果。 总之,awk是一种非常实用的文本处理命令。通过使用它,我们可以方便地处理文本文件,提高工作效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无糖酸奶

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值