使用awk 统计分析游戏后台日志中的数据

来源:互联网 发布:移动网络和机顶盒办理 编辑:程序博客网 时间:2024/06/07 10:44

awk是Unix/Linux环境下一种非常好的语言,适合于文本处理和报表生成,它还有许多精心设计的特性,允许进行特殊技巧程序设计。对于从游戏日志中抽取一些特定的信息,使用awk就非常方便。鉴于在测试工作中awk命令的重要性,因此仅以本文作一个提纲挈领的介绍,希望对初学者迅速掌握awk有所帮助。

一、awk基础语法

假设一个游戏日志名为dayreport.log,内容如下:

2014-07-23 00:03:05##attribute#41#天地#256#+#copper#2304000#173

2014-07-23 00:04:02##attribute#800#飞将军#242#+#tickets#5000#18

在命令行中输入以下命令:

$ awk '{ print $0}' dayreport.log

执行后dayreport.log文件的内容显示在屏幕上:

2014-07-23 00:03:05##attribute#41#天地#256#+#copper#2304000#173

2014-07-23 00:04:02##attribute#800#飞将军#242#+#tickets#5000#18

编写并且执行awk程序的方法很简单,如上所示,花括号内的是程序代码,后面的dayreport.log为指定的输入文件。

awk程序的基本组成为:awk ‘ BEGIN{code1} {code2} END {code3} ‘ filename

awk是一种行处理程序,执行awk时,先执行begin后面的code1代码初始化一些数据,然后依次对输入文件中的每一行执行code2代码,直到执行完所有文件行,最后执行END之后的code3。

二、分割域

要能在工作中使用awk,首先要懂得awk命令分割域的功能。即$number变量。

使用$number变量,可以将一条记录划分成多个独立的字段,例如:

$ awk –F ’#’ ‘{ print $4,$5}’ dayreport.log

输出结果为:

41天地

800飞将军

上例中,在调用awk时,使用-F选项来指定"#"作为字段分隔符。awk处理分割域之后,打印出第4和第5个域的内容,即玩家ID和玩家名字段。

三、游戏日志统计

在QA的日常工作中,游戏日志统计是一项较为普遍的工作。日志统计通常使用grep + awk的命令组合,方法如下:

1、使用grep检索出需要进行统计的所在行;

2、使用awk的行处理和分割域功能,分析统计grep检索出的数据。

下面举例介绍一下较为常用的“统计每个玩家游戏次数”和“统计每个玩家收益总数”两种方法。

四、统计次数

下面是一个例子,需求是统计每个玩家在超级翻牌活动中购买的游戏次数

在游戏日志中dayreport_name.log中,找到购买超级翻牌活动次数的日志是这样打印的:

2015-05-14 00:42:10##attribute#3467#英雄大名#282#-#sgold#3#超级翻牌购买次数

1、通过grep检索出每个玩家购买超级翻牌活动的日志:

grep –E ‘2015-05-14.*#\-#sgold#.*超级翻牌购买次数$’ dayreport_name.log

得到如下结果:

2015-05-14 00:00:59##attribute#12445#Loser#270#-#sgold#1#超级翻牌购买次数

2015-05-14 00:01:00##attribute#12445#Loser#270#-#sgold#2#超级翻牌购买次数

2015-05-14 00:05:46##attribute#1991#卡布#292#-#sgold#0#超级翻牌购买次数

2015-05-14 00:05:51##attribute#1991#卡布#292#-#sgold#0#超级翻牌购买次数

2015-05-14 00:08:22##attribute#1991#卡布#292#-#sgold#0#超级翻牌购买次数

2015-05-14 00:08:23##attribute#1991#卡布#292#-#sgold#0#超级翻牌购买次数

2015-05-14 00:41:54##attribute#3467#英雄大名#282#-#sgold#1#超级翻牌购买次数

2015-05-14 00:42:02##attribute#3467#英雄大名#282#-#sgold#2#超级翻牌购买次数

2015-05-140:42:10##attribute#3467#英雄大名#282#-#sgold#3#超级翻牌购买次数

2、使用awk命令对结果进行分析,统计每个玩家购买的次数

grep –E ‘2015-05-14.*#\-#sgold#.*超级翻牌购买次数$’ dayreport_name.log |

awk –F ‘#’ ‘{count[$4]++}END{for ( i in count) {print count[i]”#” i}}’

分析后得到如下结果,表示为购买次数和player_id:

2#12445

4#1991

3#3467

命令行解析:

1、grep –E命令,即egrep,是支持正则表达式的grep,在本例中可以不使用-E指令,但如果要匹配时间的正则表达式搜索,则需要使用grep –E

2、grep ‘超级翻牌购买次数$’ 表示检索以“超级翻牌购买次数”结尾的行

3、count[$4]++ 是一个自定义的数组,只不过其下标是player_id。awk对每一行执行一次count[$4]++这一句代码,遇到一个新的player_id,则count数组中就会多一个成员并自增1

4、awk执行完grep的结果之后,每个玩家的次数统计在count数组中。之后执行END操作,for循环遍历count数组,打印出对应的购买次数和player_id

五、统计总数

下面是另一个例子,需求是统计每个玩家在某一天消耗的系统金币总和

在游戏日志中dayreport_name.log中,找到消耗用户金币的日志是这样打印的:

2015-05-14 00:06:10##attribute#8194#李彩儿#288#-#ugold#20#超级翻牌金币全开

2015-05-14 00:10:11##attribute#8194#李彩儿#288#-#ugold#5#拜神购买次数

1、首先通过grep检索出当天所有玩家消耗用户金币的日志:

grep –E ‘2015-05-14.* #attribute#.*#\-#ugold#’ dayreport_name.log

得到如下结果:

2015-05-14 00:05:17##attribute#1991#卡布#292#-#ugold#20#超级翻牌金币全开

2015-05-14 00:05:46##attribute#1991#卡布#292#-#ugold#1#超级翻牌购买次数2015-05-14 00:05:53##attribute#1991#卡布#292#-#ugold#20#超级翻牌金币全开

2015-05-14 00:10:08##attribute#8194#李彩儿#288#-#ugold#5#拜神购买次数

2015-05-14 00:10:09##attribute#8194#李彩儿#288#-#ugold#5#拜神购买次数

2015-05-14 05:08:33##attribute#9105#BMW#292#-#ugold#5#拜神购买次数

2015-05-14 05:08:33##attribute#9105#BMW#292#-#ugold#5#拜神购买次数

2015-05-14 05:08:47##attribute#9105#BMW#292#-#ugold#10#拜神中级祭祀

2015-05-14 05:08:52##attribute#9105#BMW#292#-#ugold#10#拜神中级祭祀

2、使用awk命令对结果进行分析,统计每个玩家消费金币总额

grep –E ‘2015-05-14.* #attribute#.*#\-#ugold#’ dayreport_name.log |

awk –F ‘#’ ‘{sum[$4]+=$9}END{for ( i in sum) {print sum[i]”#” i}}’

分析后得到如下结果,表示为消费用户金币总数和player_id:

41#1991

10#8194

30#9105

命令行解析:

1、通过awk的分割域,$4是player_id,$9是消费的金币数量。

2、sum[$4]与上一个例子中的count[$4]相同,是一个自定义的数组,下标是player_id。 awk对每一行执行一次sum[$4]+=$9这一句代码

3、awk执行完grep的结果之后,每个玩家的次数统计在sum数组中。之后执行END操作,for循环遍历sum数组,打印出对应的金币消费总数和player_id

原创粉丝点击