Linux通过日志文件统计IP访问次数排序

假设我的日志文件内容如下:

218.92.217.53 - - [22/Nov/2017:17:26:27 +0800] "GET /images/rand HTTP/1.0" 200 1785 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)" "sso.baidu.com" 36.105.87.151 4000


182.118.27.97 - - [22/Nov/2017:17:26:28 +0800] "GET /images/rand HTTP/1.0" 200 1588 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Tablet PC 2.0; .NET4.0C; InfoPath.3; .NET4.0E; CIBA)" "sso.baidu.com" 123.158.3.19 4000


218.92.217.53 - - [22/Nov/2017:17:26:28 +0800] "GET /images/rand HTTP/1.0" 200 1668 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)" "sso.baidu.com" 115.153.175.138 3000


218.92.217.51 - - [22/Nov/2017:17:26:28 +0800] "GET /images/rand HTTP/1.0" 200 1501 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)" "sso.baidu.com" 125.67.186.42 3000


218.92.217.53 - - [22/Nov/2017:17:26:28 +0800] "GET /images/rand HTTP/1.0" 200 1720 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET4.0C; .NET4.0E)" "sso.baidu.com" 27.17.66.35 3000


182.118.27.97 - - [22/Nov/2017:17:26:28 +0800] "GET /images/rand HTTP/1.0" 200 1718 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)" "sso.baidu.com" 113.0.64.155 5000


218.92.217.51 - - [22/Nov/2017:17:26:28 +0800] "GET /images/rand HTTP/1.0" 200 1762 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729)" "sso.baidu.com" 183.8.202.141 3000


其中倒数第二个字段是客户端真实IP地址,现在我想根据客户IP统计访问次数,看看是否有异常攻击。就可以写一个shell命令如下:

cat logs/baidu.access.log | awk '{print $(NF-1)}' | sort | uniq -c | sort -k 1 -n -r|head -10

解释一下上面的命令,

cat logs/baidu.access.log就是输出我要统计的日志。

awk后面跟一个指令,awk '{print $(NF-1)}'就是打印出日志内容的第几列。$1就是第一列,$(NF)就是总列数,那么我要根据倒数第二列统计,就是$(NF-1)。

sort就是对内容进行排序,默认是自然顺序排序。

uniq指令用于排重,而是只适用于相邻两行相同的情况。所以一般结合sort使用。即先sort排序再排重。

uniq -u是只显示唯一的记录行。uniq -c是显示有重复记录的情况。

sort -k 1 -n -r这个指令,参看下面sort指令参数的详细说明

sort选项与参数:
-f  :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b  :忽略最前面的空格符部分;
-M  :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n  :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r  :反向排序;
-u  :就是 uniq ,相同的数据中,仅出现一行代表;
-t  :分隔符,默认是用 [tab] 键来分隔;
-k  :以哪个区间 (field) 来进行排序的意思

所以 sort -k 1 -n -r 指令的意思就是对第一列按照纯数字逆序排序。

这个纯数字是哪里来的呢?是uniq -c来的,原来剩下一列就是IP了,当执行uniq -c指令时,它会统计重复记录的次数并把这次数显示在第一列。所以现在有两列了,第一列是重复次数,第二列是IP。所以这里是按照重复次数排序。

head -10这个不用说了吧,显示前10行。

同理,如果你要统计URL的访问情况就awk url那一列就行了。


  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值