前段时间有小伙伴问我一些问题,涉及到shell脚本的编写问题,过后,我深刻思考了下,实际生产环境的确也会常常用到,所以如何写这个脚本?它的思路在哪?带这个问题引入今天的文章,仅供参考,若有不完善的地方请多指导。web
问题一:shell
编写脚本自动统计访问网站失败的IP地址segmentfault
问题二:网站
编写脚本自动统计十分钟内访问网站的IP地址this
征对这两个问题,个人解决思路以下:spa
第一个问题:日志
1)怎么才算访问网站失败?code
你们都知道,咱们也会常常打不开一网站,那么访问失败,网站日志确定会有记录的,所以,能够经过查看日志中的状态码(如200、400、403)来判断用户的访问结果server
2)获取IP地址blog
获取IP地址就很简单了,awk命令就是个不错的选择
第二个问题:
1)统计IP地址
同第一个问题同样,方法有不少,也很是简单
2)如何取得十分钟内的日志
115.59.74.25 - - [27/Feb/2017:22:54:43 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:44 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"
经过上面的日志格式,能够看出日志中是带有时间点信息的,那么只须要将时间点信息找到便可解决
3)解决时间点的问题
能够经过awk的命令来获取某段时间内的信息
awk '$4 >="[27/Feb/2017:22:54:43" && $4 <="[27/Feb/2017:22:54:53'27/Feb/2017:22:54:53"' /wwwlogs/access.log** 115.59.74.25 - - [27/Feb/2017:22:54:43 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:44 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:45 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:47 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:48 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:49 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:50 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:52 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-" 115.59.74.25 - - [27/Feb/2017:22:54:53 +0800] "GET /Home/SaveData/index HTTP/1.0" 404 3537 "-" "-"
这样就能够将一段时间内的日志信息取出
4)解决十分钟的问题
这时就须要利用到系统的命令date
[root@ ~]# date +%d/%b/%Y:%k:%M:%S 01/Mar/2017: 7:32:25 #当前时间 [root@nfs-1-1 ~]# date +%d/%b/%Y:%k:%M:%S -d '-10 minutes' 01/Mar/2017: 7:22:25 #十分钟前的时间
那么十分钟内的问题也就解决了
总结:其实编写的大致思路就是如此,拆分需求解决需求,最终用命令堆砌而成,思路决定出路。
编写脚本
自动统计访问网站失败的IP地址
vi fail_connect_ip.sh ########################################## #this scripts is for auto check client conntect to # #webserver failed # #create by mingongge at 2017--0-01 # ########################################## !/bin/sh egerp "400|403|404|500" /wwwlogs/access.log |awk '{print $1}' |sort -nr |uniq -c
最好将结果追加到一个文件,而后查看文件,由于有可能输出太多,前面的统计结果没法看到,固然实际生产环境中访问失败的状态码不止这几个
最终执行结果以下
[root@ ~]# sh fail_connect_ip.sh 1 29.20.20.3 1 2.11.22.1 8 1.1.1.1
统计十分钟内访问网站的IP地址
vi client_connect_ip.sh ########################################## #this scripts is for auto check conntect to webserver client's ip #create by mingongge at 2017--0-01 ########################################## !/bin/sh TIME=`date +%d/%b/%Y:%k:%M:%S` NTIME=`date +%d/%b/%Y:%k:%M:%S -d '-10 minutes'` #定义时间变量 awk '$4 >= "'\[$NTIME'" && $4 <= "'\[$TIME'"' /wwwlogs/access.log >log.txt #获取时间段内的日志信息 awk '{print $1}' log.txt |sort -nr |uniq #将IP地址取出整理排序
若有错误或其它问题,欢迎小伙伴留言评论、指正。若有帮助,欢迎点赞+转发分享。
欢迎你们关注民工哥的公众号:民工哥技术之路