Crazy lens

Shell 中去重并统计重复数 uniq -c 不生效问题
诶半夜了不想睡,突然看到自己网站 UV 和 ip数 统计, typecho 插件统计不清楚是否是去重统计我自己也有...
扫描右侧二维码阅读全文
20
2017/03

Shell 中去重并统计重复数 uniq -c 不生效问题

诶半夜了不想睡,突然看到自己网站 UV 和 ip数 统计, typecho 插件统计不清楚是否是去重统计
我自己也有shell 脚本统计nginx日志

    cat www.libenfu.com.access.log |cut -d ' ' -f 1 |uniq -c|sort -n -r|head -n 100

这个脚本统计的 查询nginx 日志中访问最多的前100个ip, BUT 这个shell 统计出来有问题

[root@bf logs]#sh ipBy.sh 
   5894 123.57.32.54
   4115 123.57.32.54
   3602 123.57.32.54
   3221 123.57.32.54
   3110 103.233.131.130
   2200 123.57.32.54
   2162 123.57.32.54
   1623 123.57.32.54
   1501 123.57.32.54

有重复的...

总数 11W的日志 统计 123.57.32.54 ip 3W 这个两量有点大 上面脚本统计存在问题

    [root@bf logs]#cat www.libenfu.com.access.log |wc -l
    112317
    [root@bf logs]#cat www.libenfu.com.access.log |grep 123.57.32.54 |wc -l
    34025

使用另一个去重命令 sort -u 试下

    [root@bf logs]#cat www.libenfu.com.access.log |cut -d ' ' -f 1 |sort -u |wc -l
    5125

ip 数 共计 5125
诶但是我给想个办法统计下所有ip 的访问数呀.. 上个脚本 uniq -c 不给力我觉得可能是uniq 有数量的限制吧

总结下 uniq 和 sort -u 功能一样的 去重

我在分析下自己的shell 问题应该出在uniq -c

  [root@bf logs]#tail -n 60000  www.libenfu.com.access.log |cut -d ' ' -f 1 |uniq -c |sort -n -r -k 4 -t ' ' |head -n 20

  2200 123.57.32.54
  1501 123.57.32.54
  1018 123.57.32.54
  1000 123.57.32.54
  601 123.57.32.54
  451 123.57.32.54
  219 5.9.88.103
  169 62.210.251.247
  166 178.202.133.114
  151 209.58.178.145
  151 163.172.68.136

5w时 是ok 的 没有 123.57.32.54 啧啧 这个ip是我自己使用ab 压测是搞的.. 现在出现坑了


    123.57.32.54 - - [17/Feb/2017:12:35:15 +0800] "GET / HTTP/1.0" 503 206 "-" "ApacheBench/2.3" "-" "-" 

就是这个咚咚

在睡觉前仔细看了下中文手册中对uniq 的描述

描述

uniq 命令删除文件中的重复行。
uniq 命令读取由 InFile 参数指定的标准输入或文件。该命令首先比较相邻的行,然后除去第二行和该行的后续副本。重复的行一定相邻。(在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。)最后,uniq 命令将最终单独的行写入标准输出或由 OutFile 参数指定的文件。InFile 和 OutFile 参数必须指定不同的文件。如果输入文件用“- ”表示,则从标准输入读取;输入文件必须是文本文件。文本文件是包含组织在一行或多行中的字符的文件。这些行的长度不能超出 2048 个字节(包含所有换行字符),并且其中不能包含空字符。

在发出 uniq 命令之前,请使用 sort 命令使所有重复行相邻。

问题就出在这里 我的统计脚本中访问ip肯定不是相邻的,uniq去重原理是向下找相邻的去重统计也是一样,所有问题就是处在没有先sort 改动下shell 内容:

    [root@bf logs]#cat www.libenfu.com.access.log |cut -d ' ' -f 1 |sort -r |uniq -c |sort -n -r  |head -n 10
    34025 123.57.32.54
     5989 106.38.241.151
     5388 103.233.131.130
     2200 123.56.150.61
     1941 203.208.60.193
     1865 203.208.60.196
     1823 203.208.60.194
     1796 203.208.60.195
     1785 203.208.60.197
     1278 216.244.66.232

成功了 去重之前使用sort 排序下让ip相邻达到我想要的统计, 问题并不难就是命令学习的不扎实.

最后修改:2019 年 11 月 04 日 11 : 44 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论