目录
一.awk是什么
AWK从放弃到入门:http://www.zsythink.net/archives/tag/awk
awk是一个报告生成器,它拥有强大的文本格式化的能力,以行为单位处理文本。
基本语法:
awk [options] 'Pattern{Action}' file
三要素:变量及选项、匹配模式、动作
二.变量及选项
1.NF、NR、FNR
$0:表示整行
$1:表示第一个字段,以此类推
NR:行号
NF:每行的字段数,故$NF表示一行中最后一个字段
FNR:处理多个文件时,分别显示各自的行号
[root@localhost ~]# cat test
aa bb cc
11 22 33 44
[root@localhost ~]# cat test | awk '{print NR,NF,$NF}'
1 3 cc
2 4 44
2.FS、OFS
FS:输入字段分隔符, 默认为空白符
OFS:输出字段分隔符, 默认为空白符
设置字段分隔符:-F “:”
[root@localhost ~]# cat test
aa:bb:cc
11:22:33:44
[root@localhost ~]# cat test | awk -v FS=":" -v OFS="#" '{print $1,$2}'
aa#bb
11#22
3.RS、ORS
RS:指定输入时的换行符
ORS:指定输出时的换行符
阿斯蒂芬
[root@localhost ~]# cat test
aa:bb:cc
11:22:33:44
[root@localhost ~]# cat test | awk -v RS=":" '{print NR,$0}'
1 aa
2 bb
3 cc
11
4 22
5 33
6 44
[root@localhost ~]# cat test | awk -v RS=":" -v ORS="@" '{print NR,$0}'
1 aa@2 bb@3 cc
11@4 22@5 33@6 44
4.ARGC、ARGV
FILENAME:文件名
ARGC:参数的个数,包括awk命令本身
ARGV:保存参数的数组
[root@localhost ~]# awk '{print FILENAME,ARGV[0],ARGV[1],ARGV[2],ARGC,$0}' test test1
test awk test test1 3 aa:bb:cc
test awk test test1 3 11:22:33:44
test1 awk test test1 3 aa bb cc
test1 awk test test1 3 11 22 33 44
5.自定义变量
[root@localhost ~]# awk -v str="hello,world" 'BEGIN{print str}'
hello,world
[root@localhost ~]# awk 'BEGIN{str="hello,world";print str}'
hello,world
三.匹配模式
1.BEGIN/END模式
语法:awk ‘BEGIN{action} {action} END{action}’ file
BENGIN:表示在处理文本之前要执行的动作
END:表示在处理完文本之后要执行的动作
[root@localhost ~]# cat test
aa:bb:cc
11:22:33:44
[root@localhost ~]# cat test | awk 'BEGIN{print "hello"} {print $0} END{print "world"}'
hello
aa:bb:cc
11:22:33:44
world
2.正则匹配模式
语法:awk ‘/正则/ {action}’ file
[root@node1 ~]# awk '/^p/ {print $1}' /etc/passwd
polkitd:x:999:998:User
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
若正则表达式中包含/,则需转义
[root@node1 ~]# awk '/\/bin\/bash/ {print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
liwen:x:1001:1001::/home/liwen:/bin/bash
使用扩展正则表达式,添加选项–posix或–re-interval,似乎没必要
[root@node1 ~]# cat text
hey
heey
heeey
heeeey
[root@node1 ~]# awk '/he{2,3}y/ {print $0}' text
heey
heeey
[root@node1 ~]# awk --posix '/he{2,3}y/ {print $0}' text
heey
heeey
[root@node1 ~]# awk --re-interval '/he{2,3}y/ {print $0}' text
heey
heeey
3.行范围模式
语法:awk ‘/正则1/,/正则2/ {action}’ file
解释:设正则1第一次匹配的行为m,正则2第一次匹配行n,则表示m-n之间的行
4.关系表达式模式
获取IP地址:
[root@node1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:91:29:27 brd ff:ff:ff:ff:ff:ff
inet 192.168.5.77/24 brd 192.168.5.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::1358:f897:63a7:a220/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@node1 ~]# ip a|awk 'NR==9 {print $2}'
192.168.5.77/24
四.动作
1.printf格式化输出
[root@localhost ~]# awk -v FS=":" 'BEGIN{printf "%-10s\t %s\n", "用户名称", "用户ID"} {printf "%-10s\t %s\n", $1, $3}' /etc/passwd
用户名称 用户ID
root 0
bin 1
daemon 2
adm 3
2.条件控制
直通车:http://www.zsythink.net/archives/2046
3.循环
直通车:http://www.zsythink.net/archives/2062
五.例
1.awk数组
直通车:http://www.zsythink.net/archives/2093
awk数组妙用,统计次数
2.内置函数
直通车:http://www.zsythink.net/archives/2113
3.三元运算、打印奇偶行
直通车:http://www.zsythink.net/archives/2159
打印奇偶行: