Linux命令学习--统计log中每个IP的访问次数

cat access.log输出该log文件的内容
这里写图片描述
sed -rn '/28\/Jan\/2015/p' 将含有该字段的的行输出来,即选定特定的日期。sed主要进行文本操作。
awk '{print $1}' |sort |uniq 输出该行第一项,并sort排序,uniq去除重复的。这样ipnum.txt里面即为所有的被访问ip.
这里写图片描述
遍历ipnum.txt里的每一个ip,在accesss.log里grep $i 查找包含该ip的行,
|grep -v 400 查找不包含400的行, wc -l统计行数,这样就得到了每一个IP的访问次数。
最后将其写入到result.txt里。
这里写图片描述

  1 #!/bin/bash                                                                 
  2 #将28/Jan/2015全天的访问日志放到a.txt文本
  3 cat access.log |sed -rn '/1\/Apr\/2018/p' > a.txt 
  4 #统计a.txt里面有多少个ip访问
  5 cat access.log |awk '{print $1}'|sort|uniq  > ipnum.txt
  6 #通过shell统计每个ip访问次数
  7 echo>result.txt #清空原文件
  8 for i in `cat ipnum.txt`
  9 do
 10 iptj=`cat  access.log |grep $i |grep -v 400|wc -l`
 11 echo "ip地址"$i"在2018-04-1日全天(24小时)累计成功请求"$iptj"次,平均每分钟>    请求次数为:"$(($iptj/1440)) >> result.txt
 12 done
‘|’符号表示上一段的结果作为这一段的处理内容,例如
access.log |grep $i |grep -v 400|wc -l

可以作为’且‘方法来用
另外 ||表示上一段为才执行这一段,&&表示上一段为才执行这一段

其中,不管是echo还是sed,后面的>表示追加,>>表示覆盖。我一开始使用>>,由于存在循环,所以每次迭代,都会把上次循环的的内容给覆盖掉;而使用>的话,原文件的内容仍然保留,追加上去不易查看。

最后我决定,在遍历ipnum.txt之前,先清空原文件,这样循环里写>,就可以把本次运行的所有内容的都显示出来,而且只显示本次的。

猜你喜欢

转载自blog.csdn.net/qq_18831501/article/details/80208268