解决问题:如何从一份规范化打印的日志中,统计到每一个ID的总个数。
如何统计
我用了don’t starve together游戏服务器中大家的聊天数据,统计出谁说的话最多。(最终业务目标:话说得多的可以考虑给管理员权限。)
grep Say server_chat_log.txt|awk {'print $4'}|sort|uniq -c
- 首先grep一把,是为了从众多类型(Say, Join Announcement, Quit Announcement)的日志中通过关键字拿到我想要的日志。语句为:
grep Say server_chat_log.txt
- 也可以用
less server_chat_log.txt|grep Say
,更直观,但是对于大文件,效率不如上面的高。
- 然后是分析日志格式,用awk把我想要的field打印出来。这里,开发文档中一般都有日志的格式。另外awk一般以空格作为field separator
- 我要分析的日志:
[16:01:00]: [Say] (KU_qqqqqqqq) 爱烟花的小鱼干: 哇
。可以看到,用户的ID在第4格。 - 根据awk的格式,用
awk '{print $4}'
打印出来。
- 我要分析的日志:
- 把所有ID先排序,再统计。
sort
: 排序uniq -c
: uniq -c是可以count每一个元素出现的次数。
- (Optional)最后把统计结果再排序:
sort -n -r
: 把统计结果用数字进行排序(-n
),然后再倒序排序(-r
)。
命令详解
sort
-n: 按照数字排序
-r: 倒序排序
uniq
可以从规范化打印的日志中,找到特定位置的元素,并且统计出相应的数目。需要先使用sort,再使用uniq -c来count所有元素。
Note: ‘uniq’ does not detect repeated lines unless they are adjacent. You may want to sort the input first, or use sort -u
without uniq
. Also, comparisons honor the rules specified by ‘LC_COLLATE’.
翻译成中文:
在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。
日志样例
[15:53:44]: [Say] (KU_xxxxxxxx) 子不语: 小妾。。。
[15:53:54]: [Say] (KU_xxxxxxxx) 子不语: 听着怪怪的。。
DST_Stats|9.331545,6.191408,1.257750,6,8[15:54:40]: [Say] (KU_yyyyyyyy) WaiT: 圣诞树长好就能挂彩灯了
[15:55:18]: [Leave Announcement] 二次元
DST_Stats|7.270835,4.619142,1.153396,5,8[15:55:50]: [Join Announcement] 射命丸
DST_Stats|7.367698,5.289487,0.867764,6,8DST_Stats|7.979237,5.063091,1.189214,6,8[15:57:51]: [Say] (KU_hhhhhhhh) WaiT: 感觉这个树长好要好久头疼
DST_Stats|7.539922,5.255657,0.787640,6,8[15:59:03]: [Say] (KU_hhhhhhhh) WaiT: 你们谁身上还有彩灯
DST_Stats|7.302591,5.121131,0.857226,6,8[15:59:58]: [Say] (KU_hhhhhhhh) WaiT: 姐姐没做避雷针怎么说谁弄
[16:00:18]: [Say] (KU_QQQQQQQQ) Lorzen: 等他上线吧 掉了
DST_Stats|7.112324,5.115301,0.681791,7,8[16:00:46]: [Join Announcement] 1282809699
[16:01:00]: [Say] (KU_qqqqqqqq) 爱烟花的小鱼干: 哇
[16:01:17]: [Say] (KU_QQQQQQQQ) Lorzen: 我都守一天 先让给我吧