从日志拿数据(grep, awk, sort, uniq)

解决问题:如何从一份规范化打印的日志中,统计到每一个ID的总个数。

如何统计

我用了don’t starve together游戏服务器中大家的聊天数据,统计出谁说的话最多。(最终业务目标:话说得多的可以考虑给管理员权限。)

grep Say server_chat_log.txt|awk {'print $4'}|sort|uniq -c

  1. 首先grep一把,是为了从众多类型(Say, Join Announcement, Quit Announcement)的日志中通过关键字拿到我想要的日志。语句为:
    • grep Say server_chat_log.txt
    • 也可以用less server_chat_log.txt|grep Say更直观,但是对于大文件,效率不如上面的高。
  2. 然后是分析日志格式,用awk把我想要的field打印出来。这里,开发文档中一般都有日志的格式。另外awk一般以空格作为field separator
    • 我要分析的日志: [16:01:00]: [Say] (KU_qqqqqqqq) 爱烟花的小鱼干: 哇 。可以看到,用户的ID在第4格。
    • 根据awk的格式,用awk '{print $4}'打印出来。
  3. 把所有ID先排序,再统计
    • sort: 排序
    • uniq -c: uniq -c是可以count每一个元素出现的次数。
  4. (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: 我都守一天 先让给我吧

发表评论

电子邮件地址不会被公开。 必填项已用*标注