设为首页 收藏本站
查看: 994|回复: 0

每日一道shell脚本练习(02)

[复制链接]

尚未签到

发表于 2018-8-20 10:34:10 | 显示全部楼层 |阅读模式
1. 题目
  有日志 1.log,部分内容如下:
  

112.111.12.248 - [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com  "/seccode.php?update=0.5593110133088248" 200"http://formula-x.haotui.com/registerbbs.php" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)"  
61.147.76.51 - [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com "/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71" 301"http://xyzdiy.×××thread-1435-1-23.html" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
  

  请统计出每个IP的访问量是多少?

2. 题目分析
  根据日志内容,可以看到IP地址就是第一段的内容,所以只需把1.log的第一段给过滤出来,然后进一步统计每个IP的数量即可。
  过滤第一段,使用awk就可以了,而统计每个IP的访问量则需要排序然后再计算数量,排序使用sort命令,统计每个IP的访问量用uniq。

3. 具体shell命令
  这道题,用shell脚本一条命令就足够了:
  

awk  '{print  $1}'  1.log | sort   -n  | uniq  -c | sort  -n  

  

  解释:


  • awk 命令在分段方面比较有优势,这里的{print $1}将第一段打印出来,awk可以用-F指定分隔符,如果不指定分隔符,默认就以空白字符(比如空格、tab等),本题中,IP地址就是第一段。
  • sort 命令就是排序,-n选项表示以数字的形式排序。如果不加-n,则以ASCII排序,本题的IP地址用数字的形式排序更易区分。
  • uniq 命令用来去重复,一个文本如果有多行内容是一模一样的,就使用uniq命令将相同的内容删除,只保留一行。-c选项作用是计算重复的行数。所以,uniq -c 的作用正好就统计了ip的访问量。不过,要注意,uniq去重要在排序之后进行。
  • 最后的sort -n意思是按访问量大小来排序,请求量越大的ip排在越后面。如果加一个-r选项,sort -nr,就是倒序排序。
4. 结语
  这道题目还有另一种解法,明天再更新吧。
  补充于4月11日
  由于这篇文章在题目的例子里有一些IP连接,所以每次修改发文官方都要重新审核一天,我就不重新再写一篇文章来写另一种方法了。
  这种方法最主要的区别,就是使用了awk的数组来统计结果,请看命令:
  

awk '{sum[$1]+=1};END{ for( a in sum)print (sum[a], a)}' 1.log | sort -nr | head -n 5  

  解释一下,这条命令中$1 就表示日志中的IP地址,用IP地址作为数组的下标,每发现一个相同的IP地址,就统计数量加1;当awk遍历日志文件1.log 完毕,再循环输出数组 sum 的结果,要注意数组的下标是 ip地址。
  后面的 head  -n 5 是为了输出出现访问次数最高的5个访问ip地址。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554178-1-1.html 上篇帖子: shell脚本forloops&whileloops题解 下篇帖子: shell采坑之旅--变量$PWD引发的血案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表