博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk数组命令经典生产实战应用拓展
阅读量:5856 次
发布时间:2019-06-19

本文共 4194 字,大约阅读时间需要 13 分钟。

本博文为老男孩linu培训机构早期的培训教案,特分享以供大家学习参考。
全部系列分为五篇文章,本博文为第三篇:

awk数组命令生产实战拓展
统计apache日志单ip访问请求数排名(这个常用,考试也常考)

假设apache日志内容access.log内容为:

10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.41 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

给出3种解决方案

法一:

[root@oldboy /]# awk '{++S[$1]} END {for (oldboy in S) print oldboy ,S[oldboy]}' access.log |sort -rn -k2

10.0.0.41 3

10.0.0.47 2

10.0.0.46 2

10.0.0.42 2

10.0.0.43 1

#提示 $1为第一个域的内容。-k2 为对第二个字段排序,即对数量排序。

2

[root@oldboy /]# awk '{print $1}' access.log|sort|uniq -c |sort -rn -k1

3 10.0.0.41

2 10.0.0.47

2 10.0.0.46

2 10.0.0.42

1 10.0.0.43

提示:这个方法是容易想到的简单易用的方法,对于大多数同学来说,此法其实更适合大家,awk数组的方法看起来好,实际上对于初级运维来来说有点难度,经常记不住。

3

[root@oldboy /]# sed's/- -.*$//g' access.log|sort|uniq -c|sort -rn -k1

3 10.0.0.41 

2 10.0.0.47 

2 10.0.0.46 

2 10.0.0.42 

1 10.0.0.43 

提示:sed管道后的第一个sort是让所有一样的IP挨着,因为uniq -c只能对相邻的IP行去重计数。

此题的解答可以有10几种,前面的课程我们已经带大家细讲了,这里就不一一讲解了。

统计apache日志单ip访问请求数排名价值何在?

解答:通过前面的命令,我们可以找到什么IP的访问apache比较频繁,一般单个IP访问数量过百,就值得怀疑了,如果短时间内上万PV访问,说明就不正常了,可以采取相应的处理手段,比如封掉此IP,此法要慎重,否则,可能会有误封问题,因为,国内的大多数公司还是NAT上网的,出口一个IP

统计服务器当前单IP连接数最大的IP地址前十

提示:这个命令可以查出遭受DOS***的客户端IP地址。待处理内容如下:

netstat -n >test.log的结果:

Active Internet connections (w/o servers)

Proto Recv-Q Send-Q Local AddressForeign AddressState

tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV

tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV

tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV

tcp00 124.123.3.77:80121.31.42.148:2338TIME_WAIT

tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1

tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT

tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1

tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT

tcp01 124.123.3.77:8059.49.174.176:26913CLOSING

tcp00 124.123.3.77:80121.31.42.148:1787TIME_WAIT

tcp0174 124.123.3.77:80183.8.74.57:1165CLOSING

问题解决方案

[root@OLDBOY ~]# awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}' test.log |sort -rn -k2

121.31.42.148 3

183.8.74.57 2

Foreign 1

61.178.184.222 1

59.49.174.176 1

222.79.242.74 1

219.85.194.23 1

183.10.154.60 1

124.236.0.214 1

提示:

1)结果中的字符等,你可以进一步过滤。

2) 对于多分隔符匹配的用法大家可以参考老男孩的博文

3)实际生产中,我们过滤出已经建立连接的状态ESTABLISHED,然后,应用上述命令处理,完整命令可能为:

netstat -an|awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}'|sort -rn -k2

生产环境案例

[leo@LVS-1-1 ~]$ netstat -an|grep EST|awk '{print $5}'|cut -d : -f 1|grep -v "^$"|awk '{++ETT[$1]} END {for (oldboy in ETT) print "ip:"oldboy "-----",ETT[oldboy] ''}'|sort -rn -k2|head -10

ip:220.181.125.69----- 51

ip:121.9.222.164----- 38

ip:121.9.222.158----- 38

ip:121.9.222.156----- 38

ip:121.9.222.161----- 36

ip:121.9.222.160----- 32

ip:121.9.222.159----- 32

ip:121.9.222.162----- 31

ip:61.163.7.200----- 29

ip:115.193.163.61----- 27

提示:这是早期的命令案例,我们看到命令虽然很简单,但是搞的很复杂。实际上可以用下面看起来简单,但是难度很大的命令替代之。

netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2

注意,这里过滤的是已经建立连接的的连接,即状态ESTABLISHED。

本案例解决的生产问题

netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2

注意,这里过滤的是已经建立连接的的连接,即状态ESTABLISHED。

对于命令结果中,单IP结尾的数大的,可以认为是不正常的访问。如 121.31.42.148 100 ,表示一个IP100个连接

一般来说可以怀疑不正常,当网站压力大时,可以考虑限制或封掉这些冒似非法IP,当然,也不排除,企业里多个用户用一个出口IP访问。

壮士扼腕,有时也是必须的,否则,可能网站整体影响更大,甚至瘫痪。有时,各种搜索引擎的爬虫是很疯狂的,通过本例及上面的案例,我们可以再负载IO高时,能够进行临时应对,当然,这不是长久的方法,优化网络和服务器,部署大规模集群服务器才是较好的解决之道。

4.2.4 IDC机房带宽突然暴涨问题经典案例

本文未完待续。更多博文内容:
本系列博文完整内容共5篇:

第一篇:详解linux netstat输出的网络连接状态信息
第二篇:庖丁解牛获取连接状态数的awk数组命令
第三篇:awk数组命令经典生产实战应用拓展
第四篇:老男孩培训第八节课前awk考试题案例(门户面试题解答) 
第五篇:linux生产服务器有关网络状态的优化措施(告一段落) 

转载地址:http://ieajx.baihongyu.com/

你可能感兴趣的文章
基本信息项目目标文档
查看>>
DNN Web Platform 官方汉化版本 5.5
查看>>
移动开发Html 5前端性能优化指南
查看>>
UGUI 分页渐变居中效果
查看>>
silverlight style和template 使用之tip
查看>>
Eclipse配置python环境
查看>>
第十二周总结
查看>>
Import declarations are not supported by current JavaScript version--JavaScript版本不支持导入声明...
查看>>
js兼容性大全
查看>>
晶振不起振的原因及其解决方法
查看>>
学习目标
查看>>
《利用python进行数据分析》学习笔记--数据聚合与分组(groupby)
查看>>
C++中的函数指针模板
查看>>
2015年个人总结
查看>>
C#编程(六)------------枚举
查看>>
高性能 Windows Socket 组件 HP-Socket v2.3.1-beta-2 发布
查看>>
ZOJ 3316 Game 一般图最大匹配带花树
查看>>
《系统架构师》——操作系统和硬件基础
查看>>
如何看待一本图书
查看>>
angularjs1-7,供应商
查看>>