诶半夜了不想睡,突然看到自己网站 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相邻达到我想要的统计, 问题并不难就是命令学习的不扎实.