在日常的工作中,我们往往会碰到日志统计的问题。对于数据统计的场景,可能不是很难,但是确实是很麻烦的事情。因为如果简单的场景还好,用Shell基本的命令即可。或者说,麻烦点,用python、java也可以做。但是这些都是很麻烦的,你需要控制Io,反复拷贝文件,由于有时候是很杂乱的,写程序还要反反复复调试。其实对于一般的场景awk是一个很好的工具,这是一个我面试碰见例子,也是我实际中用到的case:
Q:如何统计日志中各个时间段用户活跃的程度?
首先,我日志是有一个类似于心跳的接口,用户触发之后会打出日志。日志大概是这样的:
[07-22 08:21:21] xxxxxxx....
因为我只关心时间,需要对时间段进行统计,那么我只需要取出08即可。
用awk实现是split($2,a,":") 取出a[1]即可。
那么我同时还需要遍历全部数据,对在指定时间段内的日志做统计,因为awk中的数据类似于map,不一定要用int做key。所以我可以用“08”做key,同理“09” “10”都可以。
那么我写了以下语句:
cat xxx.log | grep 'xxxx' | awk '{split($2,a,":");b[a[1]]+=1} END{for(i in b) printf("%10s %5d\n",i,b[i])}' | sort
就达到了目的,遍历每一行的时候对b[key]+=1,像map一样。最后再END中打印出数组b,就得到了数据的统计信心。
如下图所示:
只需要一行命令就解决了所有问题,十分方便。