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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一道shell脚本练习(02)相关的知识,希望对你有一定的参考价值。

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

解释:

  1. awk 命令在分段方面比较有优势,这里的{print $1}将第一段打印出来,awk可以用-F指定分隔符,如果不指定分隔符,默认就以空白字符(比如空格、tab等),本题中,IP地址就是第一段。
  2. sort 命令就是排序,-n选项表示以数字的形式排序。如果不加-n,则以ASCII排序,本题的IP地址用数字的形式排序更易区分。
  3. uniq 命令用来去重复,一个文本如果有多行内容是一模一样的,就使用uniq命令将相同的内容删除,只保留一行。-c选项作用是计算重复的行数。所以,uniq -c 的作用正好就统计了ip的访问量。不过,要注意,uniq去重要在排序之后进行。
  4. 最后的sort -n意思是按访问量大小来排序,请求量越大的ip排在越后面。如果加一个-r选项,sort -nr,就是倒序排序。

4. 结语

这道题目还有另一种解法,明天再更新吧。

以上是关于每日一道shell脚本练习(02)的主要内容,如果未能解决你的问题,请参考以下文章

每日一道shell练习(06)——检测端口服务

每日一道shell练习(04)

每日一道shell练习(03)

每日一道shell练习(10)——统计字符数

每日一道shell练习(09)——sed处理

Shell练习