33.1、命令介绍:

awk不仅仅是linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告。

awk的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令

行上直接编辑命令进行操作,也卡伊编写成awk程序进行更为复杂的运用。


33、awk命令详解_服务器


33、awk命令详解_html_02

33.2、 区域和记录:

1、区域:

$0(取整行数据) $1 $2 $3 $4 $5....$NF(代表最后一个字段)

2、记录:


33、awk命令详解_html_03


33、awk命令详解_服务器_04

33.3、数据切割:

默认情况下是以空字符串为分割符来分割列的;

-F:以特定条件分割

[ :]+:以“:”和“ ”分割多行连接

NR:行数

{print $1} :要打印的内容

$0:表示一行

NF:表示最后一行

[root@m01 ~]# awk -F "[ /]+" 'NR>1 && NR<5 {print $2}' /etc/passwd

bin:

sbin:

var

[root@m01 ~]# awk 'NR>1 && NR<5 {print $0}' /etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin


33、awk命令详解_服务器_05


33、awk命令详解_html_06


33、awk命令详解_数据_07

33.4、awk数组:

1、awk数组介绍:

类似于shell中的数组

提供BEGIN和END的作用是给程序赋予初始状态和在程序结束之后执行一些扫尾工作;

任何在BEGIN之后列出的操作且在{}内,将在awk开始扫描输入之前执行,而END之后列出

的操作将在扫描完全部的输入之后执行;

因此,通常使用BEGIN来显示变量和初始化变量,所有的内容写在一起;使用END来输出最终结果,后面接文件;

两者最好不要同时使用;

2、awk数组脚本:

[root@backup scripts]# vim awk.sh

#!/bin/awk

BEGIN{

array[1]="lc"

array[2]="lc1"

for (key in array)

print key,array[key]

}

[root@backup scripts]# awk -f awk.awk

1 lc

2 lc1

3、awk命令行模式:

(1)BEGIN模式:

[root@backup scripts]# awk 'BEGIN {array[1]="lc";array[2]="lc1";for (key in array) print key,array[key]}'

1 lc

2 lc1

(2)END模式:

1)测试参数:

[root@backup scripts]# cat awk1.txt

1 beijing

2 shanghai

2)使用命令:

[root@backup scripts]# awk '{array[$1]=$2}END{for(key in array) print key,array[key]}' awk1.txt

1 beijing

2 shanghai

#参数解释:

array[$1]=$2 #$1代表第一列内容作为下标,$2代表第二列的内容作为值,然后放入数组array后进行输出;

33.5、awk的企业案例题:

1、对网站地址进行统计:

(1)实验数据:

[root@backup scripts]# vim www.txt

​http://mp3.lc.com/index.html​

​http://post.lc.com/index.html​

​http://post.lc.com/index.html​

​http://www.lc.com/index.html​

​http://www.lc.com/index.html​

​http://www.lc.com/index.html​

(2)命令代码:

[root@backup scripts]# awk -F '/' '{array[$3]++}END{for (key in array) print key,array[key]}' www.txt | sort -rn -k 2 | head -10

www.lc.com 3

post.lc.com 2

mp3.lc.com 1

array[$3]=array[$3]+1等价于array[$3]++

1)代码的读取方式:

读取第一行:array[mp3.lc.com]=1

读取第二行:array[post.lc.com]=1 #被覆盖

读取第三行:array[post.lc.com]=2

读取第四行:array[www.lc.com]=1 #被覆盖

读取第五行:array[www.lc.com]=2 #被覆盖

读取第六行:array[www.lc.com]=3

2、对web日志分析,列出访问最多的ip地址,并按照降序排列:

(1)方法一:

[root@backup scripts]# awk '{s[$1]++} END {for (k in s) print k,s[k]}' access_log | sort -k 2 -nr | head -10

172.16.1.41 42

::1 6

172.16.1.254 5

(2)方法二:

[root@backup scripts]# awk '{print $1}' access_log | sort | uniq -c | sort -rn | head -10

42 172.16.1.41

6 ::1

5 172.16.1.254

3、统计企业工作中高并发web服务器不同网络连接状态对应的数量:

(1)方法一:

[root@backup scripts]# awk '/^tcp/ {S[$NF]++} END {for (k in S) print S[k],k}' netstat.log | sort -nr | head -10

7 LISTEN

1 ESTABLISHED

(2)方法二:

[root@backup scripts]# awk '/^tcp/ {print $NF}' netstat.log | sort | uniq -c | sort -rn | head -10

7 LISTEN

1 ESTABLISHED

4、解决机房流量暴涨案例问题:

(1)案例


33、awk命令详解_数据_08


33、awk命令详解_服务器_09


33、awk命令详解_服务器_10

拔掉上连口网线;

过几分钟将网线口接上;

查看流量服务器,看哪台服务器流量大:

如果所有服务器流量都很大,是dos攻击;

如果是就1到2台有问题就是服务器中毒,需要将网线拔掉,

然后重装服务器或迁移到其它服务器上;

(2)解决代码:

输出格式:[访问次数*单个文件大小] [访问次数] [文件名(需要带url)]

方法一:

使用纯awk命令,比较难理解舍弃;

方法二:

[root@backup scripts]# awk '{print $7"\t"$10}' access_log | sort | uniq -c | awk '{print $1*$3"\t"$1"\t"$2}' | sort -rn | head -10

4961 1 /

3956 1 /icons/poweredby.png

2326 1 /icons/apache_pb.gif

572 2 /favicon.ico

36 6 /

0 42 /