awk的常用操作场景以及工作中涉及到的一些场景实例

时间:2021-02-15 16:08:29

废话不多说,直接上这个实例:

一. 统计apache日志单ip访问请求数排名:

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

 1 10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 2 10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 3 10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 4 10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 5 10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 6 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 7 10.0.0.41 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 8 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
 9 10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
10 10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -

  一般的做法是:

1 [root@localhost /]# awk '{print $1}' access.log|sort|uniq -c |sort -rn -k1
2 3 10.0.0.41
3 2 10.0.0.47
4 2 10.0.0.46
5 2 10.0.0.42
6 1 10.0.0.43

  一直在思考 统计IP最多的数的意义何在?

  其实,一般单个IP访问数量过百,就值得怀疑了,如果短时间内上万PV访问,说明就不正常了,可以采取相应的处理手段,比如封掉此IP,此法要慎重,否则,可能会有误封问

题,因为,国内的大多数公司还是NAT上网的,出口一个IP。

 

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

  使用netstat -an >>test.log 可以将连接到服务器的一些基本信息重定向到文本文件中,假设内容如下:

 1 Active Internet connections (w/o servers)
 2 Proto Recv-Q Send-Q Local AddressForeign AddressState
 3 tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV
 4 tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV
 5 tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV
 6 tcp00 124.123.3.77:80121.31.42.148:2338TIME_WAIT
 7 tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1
 8 tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT
 9 tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1
10 tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT
11 tcp01 124.123.3.77:8059.49.174.176:26913CLOSING
12 tcp00 124.123.3.77:80121.31.42.148:1787TIME_WAIT
13 tcp0174 124.123.3.77:80183.8.74.57:1165CLOSING

  使用awk可以统计出ESTABLISHED的一些IP的链接信息:

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 ,表示一个IP有100个连接

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

  壮士扼腕,有时也是必须的,否则,可能网站整体影响更大,甚至瘫痪。有时,各种搜索引擎的爬虫是很疯狂的,通过本例及上面的案例,我们可以再负载IO高时,能够进行临

时应对,当然,这不是长久的方法,优化网络和服务器,部署大规模集群服务器才是较好的解决之道。

  我们可以使用awk进行简单地统计线上服务器的一些负载,保证服务器的高效运行。