awk的命令格式
awk -F|-f|-v 'BEGIN{ } / / {comand1;comand2} END{ }' file
-F 定义列分隔符
-f 指定调用脚本
-v 定义变量
' '引用代码块,awk执行语句必须包含在内
BEGIN{ } 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
{ } 命令代码块,包含一条或多条命令
/ / 用来定义需要匹配的模式(字符串或者正则表达式),对满足匹配模式的行进行上条代码块的操作
END{ } 结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
awk的内建变量
创建一个实例文本
[root@Slave3 home]# cat netstat.txt
Proto Recv-Q Send-Q Local-Address Foreign-Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT
tcp 0 0 coolshell.cn:80 61.140.101.185:37538 FIN_WAIT2
tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 coolshell.cn:80 116.234.127.77:11502 FIN_WAIT2
tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 1 coolshell.cn:80 124.152.181.209:26825 FIN_WAIT1
tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT
tcp 0 1 coolshell.cn:80 208.115.113.92:50601 LAST_ACK
tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
tcp 0 0 coolshell.cn:80 117.136.20.85:50025 FIN_WAIT2
tcp 0 0 :::22 :::* LISTEN
例子1
输出netstat.txt的第1,4列
- 单引号中的被大括号括着的就是awk的语句,注意,其只能被单引号包含
- 其中的n表示第几例。注:$0表示整个行
[root@Slave3 home]# awk '{print $1,$4}' netstat.txt
Proto Local-Address
tcp 0.0.0.0:3306
tcp 0.0.0.0:80
tcp 127.0.0.1:9000
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp coolshell.cn:80
tcp :::22
例子2:格式化输出
[root@Slave3 home]# awk '{printf "%-8s %-8s\n",$1,$2}' netstat.txt
Proto Recv-Q
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
tcp 0
列子3:输出行号
NR表示行号
[root@Slave3 home]# awk '{print NR,$0}' netstat.txt
1 Proto Recv-Q Send-Q Local-Address Foreign-Address State
2 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
3 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
4 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN
5 tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT
6 tcp 0 0 coolshell.cn:80 61.140.101.185:37538 FIN_WAIT2
7 tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
8 tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
9 tcp 0 0 coolshell.cn:80 116.234.127.77:11502 FIN_WAIT2
10 tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
11 tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT
12 tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
13 tcp 0 1 coolshell.cn:80 124.152.181.209:26825 FIN_WAIT1
14 tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
15 tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT
16 tcp 0 1 coolshell.cn:80 208.115.113.92:50601 LAST_ACK
17 tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
18 tcp 0 0 coolshell.cn:80 117.136.20.85:50025 FIN_WAIT2
19 tcp 0 0 :::22 :::* LISTEN
例子4:过滤条件输出
找到第三列是0且第六列是LISTEN的行并输出
其他比较运算符:!=, >, <, >=, <=
[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" {print $0}' netstat.txt
tcp 0 0 :::22 :::* LISTEN
例子5:过滤+格式化输出
[root@Slave3 home]# awk '$3==0 && $6=="LISTEN" || NR==1 {printf "%-20s %-20s %s\n",$4,$5,$6}' netstat.txt
Local-Address Foreign-Address State
:::22 :::* LISTEN
例子6:指定分隔符输出
[root@Slave3 home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin
oprofile:x:16:16:Special user account to be used by OProfile:/home/oprofile:/sbin/nologin
vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
hsqldb:x:96:96::/var/lib/hsqldb:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
-F: 表示使用:进行分割
NR: 上面说表示行号,我们这了过滤出前9条数据
[root@Slave3 home]# awk -F: 'NR < 10 {print $1,$2}' /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
例子7:指定分隔符分割并指定分隔符输出
如例子6我们采用:作为分割符分割,输出时默认是采用空格来输出每个列的,我们可以执行输出时的分割符
[root@Slave3 home]# awk -F: 'NR < 10 {print $1,$2}' OFS="\t" /etc/passwd
root x
bin x
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
例子8:使用正则表达式过滤
$1 ~ /w+/ 表示第一列采用表达式w+来过滤。 ~表示模式开始 //之间插入正则表达式
[root@Slave3 home]# awk -F: '$1 ~ /w+/ {print $0}' /etc/passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
BCS-myview-web:x:476:471:BCS-myview-web:/home/BCS-myview-web:/bin/bash
awk常用正则表达式
例子9:反模式过滤
对例子8的结果取反,反模式采用的是!~
[root@Slave3 home]# awk -F: '$1 !~ /w+/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
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
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
.....
例子10:拆分文件
按照第六列将第六列的值拆分成好几个文件,例如第六列有aa,bb,cc,dd 则拆分后会分成 aa,bb,cc,dd这几个文件,aa里面就包含第六列为aa的所有数据
[root@Slave3 xuzhiyong]# awk 'NR!=1{print > $6}' netstat.txt
[root@Slave3 xuzhiyong]# ls
ESTABLISHED? FIN_WAIT1? FIN_WAIT2? LAST_ACK? LISTEN LISTEN? netstat.txt TIME_WAIT?
[root@Slave3 xuzhiyong]# ll
total 32
-rw-r--r-- 1 root root 504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root 82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root 246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root 81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root 78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root 237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root 246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cd ESTABLISHED^M
: Not a directoryISHED
[root@Slave3 xuzhiyong]# cat ESTABLISHED?
tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
例子11:拆分文件采用if语句自定义拆分
NR!=1 表示不输出第一行,就是表头
里面的条件逻辑表示将第六行为TIME|ESTABLISHED放到1.txt;LISTEN放到2.txt;其他的放到3.txt
[root@Slave3 xuzhiyong]# awk 'NR!=1 {if($6 ~ /TIME|ESTABLISHED/) print > "1.txt"; else if($6 ~ /LISTEN/) print > "2.txt"; else print > "3.txt"}' netstat.txt
[root@Slave3 xuzhiyong]# ll
total 44
-rw-r--r-- 1 root root 750 Mar 22 17:46 1.txt
-rw-r--r-- 1 root root 315 Mar 22 17:46 2.txt
-rw-r--r-- 1 root root 409 Mar 22 17:46 3.txt
-rw-r--r-- 1 root root 504 Mar 22 17:23 ESTABLISHED?
-rw-r--r-- 1 root root 82 Mar 22 17:23 FIN_WAIT1?
-rw-r--r-- 1 root root 246 Mar 22 17:23 FIN_WAIT2?
-rw-r--r-- 1 root root 81 Mar 22 17:23 LAST_ACK?
-rw-r--r-- 1 root root 78 Mar 22 17:23 LISTEN
-rw-r--r-- 1 root root 237 Mar 22 17:23 LISTEN?
-rw-r--r-- 1 root root 1551 Mar 22 16:54 netstat.txt
-rw-r--r-- 1 root root 246 Mar 22 17:23 TIME_WAIT?
[root@Slave3 xuzhiyong]# cat 1.txt
tcp 0 0 coolshell.cn:80 124.205.5.146:18245 TIME_WAIT
tcp 0 0 coolshell.cn:80 110.194.134.189:1032 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49809 ESTABLISHED
tcp 0 0 coolshell.cn:80 123.169.124.111:49829 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.215.36:36970 TIME_WAIT
tcp 0 4166 coolshell.cn:80 61.148.242.38:30901 ESTABLISHED
tcp 0 0 coolshell.cn:80 110.194.134.189:4796 ESTABLISHED
tcp 0 0 coolshell.cn:80 183.60.212.163:51082 TIME_WAIT
tcp 0 0 coolshell.cn:80 123.169.124.111:49840 ESTABLISHED
例子12: 统计字节数量
****awk命令是针对每一个行进行的操作****
例如统计文件夹下这些文件的总共大小
[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h
-rw-r--r-- 1 root root 73 Mar 24 05:54 1.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 1.cpp
-rw-r--r-- 1 root root 0 Mar 24 05:51 1.h
-rw-r--r-- 1 root root 0 Mar 24 05:51 2.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 2.cpp
-rw-r--r-- 1 root root 57 Mar 24 05:55 2.h
-rw-r--r-- 1 root root 0 Mar 24 05:51 3.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 3.h
-rw-r--r-- 1 root root 0 Mar 24 05:51 4.c
-rw-r--r-- 1 root root 0 Mar 24 05:51 4.h
使用管道命令 | 对 ls -l .cpp .c .h 输出的结果做统计。其中记住awk命令是针对每一个行进行的操作*,所以{sum+=$5}表示每一行的第五列的值都加起来,然后内建变量END指定处理完每一行后的操作{print sum}
[root@server-1 xuzhiyong]# ls -l *.cpp *.c *.h | awk '{sum+=$5} END {print sum}'
130
例子13:统计2
[root@server-1 xuzhiyong]# awk 'BEGIN {count=0 ; print "=====start====="} {count++;} END {print "The file size is ",count}' /etc/passwd
=====start=====
The file size is 35
例子14:awk的内嵌函数
[root@server-1 xuzhiyong]# awk '{print length($6)}' netstat.txt
6
7
7
7
10
10
12
12
10
12
10
12
10
12
10
9
12
10
6