awk ‘条件1 {动作1} 条件2 {动作2} …’ filename
sed对一整行进行处理,awk将行分成一个个“字段”来处理。默认的字段分隔符为空格键或[Tab]键
在每一行的每个字段都有变量名称,分别对应$1,$2,……。$0代表一整行。
awk的几个内置变量
变量名称 | 代表的意义 |
---|---|
NF | 每一行($0)拥有的字段总数 |
NR | 目前awk所处理的是“第几行”数据 |
FS | 目前的分割字符,默认是空格键 |
查看文件
[root@lishan ~]# head -2 passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
取文件passwd第二行
[root@lishan ~]# awk -F: 'NR==2' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@lishan ~]# awk -F: NR==1 passwd
root:x:0:0:root:/root:/bin/bash
取文件passwd第一列
[root@lishan ~]# awk -F: '{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
ftp
nobody
取文件passwd第二行第一列
[root@lishan ~]# awk -F: 'NR==2{print $1}' passwd
bin
取文件passwd第二行最后一列
[root@lishan ~]# awk -F: 'NR==1{print $NF}' passwd
/bin/bash
取文件passwd第二行倒数第二列
[root@lishan ~]# awk -F: 'NR==1{print $(NF-1)}' passwd
/root
取出IP地址用正则表达式
[ /]表示指定范围类任意一个字符,+表示匹配前面任意一个字符至少一次
[root@lishan ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:69:c9:c3 brd ff:ff:ff:ff:ff:ff
inet 192.168.181.140/24 brd 192.168.181.255 scope global dynamic eth0
valid_lft 1569sec preferred_lft 1569sec
inet6 fe80::20c:29ff:fe69:c9c3/64 scope link
valid_lft forever preferred_lft forever
[root@lishan ~]# ip a|grep 'inet'|awk -F'[ /]+' 'NR==3{print $3}'
192.168.181.140
取出文件abc找到含有lishan一行的最后一列
[root@lishan ~]# cat abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
lishan 5 67 loulou
[root@lishan ~]# awk '/lishan/{print $NF}' abc
haha
取出文件abc中含有lishan的一行的最后一列,并写入到文件的a中
[root@lishan ~]# awk '/l/ishan/{print $NF}' abc | tee a
haha
loulou
[root@lishan ~]# ls
a abc network.repo nfs.sh passwd scp.exp server.sh ssh-keygen.exp test.awk
[root@lishan ~]# cat a
haha
loulou
同时取出两列中间要加入英文符号逗号会显示出空格
[root@lishan ~]# awk '{print $1,$2}' abc
lishan 1
zhaojing 2
wangxuan 3
yangwei 4
lishan 5
[root@lishan ~]# awk '{print $1$2}' abc
lishan1
zhaojing2
wangxuan3
yangwei4
lishan5
在awk命令中加入begin开始语句会在输出时显示begin里面的内容
[root@lishan ~]# awk 'BEGIN{print "name rank"} {print $1,$2}' abc
name rank
lishan 1
zhaojing 2
wangxuan 3
yangwei 4
lishan 5
在awk语句中加入end语句会在输出结尾处显示end里面的内容
[root@lishan ~]# awk 'BEGIN{print "name ran/k"} {print $1,$2} END{print "以上是全部学生"}' abc
name rank
lishan 1
zhaojing 2
wangxuan 3
yangwei 4
lishan 5
以上是全部学生
用脚本执行awk命令,在脚本中写入想要执行的命令
[root@lishan ~]# cat test.awk
#!/bin/bash/awk
{print $2}
用awk命令-f执行脚本并且加需要执行脚本的文件名
[root@lishan ~]# awk -f test.awk abc
1
2
3
4
5
awk加入正则表达式(如果5小于29)就取出全部
[root@lishan ~]# awk '{if($5<29) print $0}' abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
lishan 5 67 loulou
在abc文件的第二列查找有数字5的那一行并打印
[root@lishan ~]# awk '$2 ~ /5/{print $0}' abc
lishan 5 67 loulou
在abc文件的第二列中取出除去不含数字5的那一行并打印
[root@lishan ~]# awk '$2 !~ /5/{print $0}' abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
[root@lishan ~]# awk '{if($2!~/5/)print $0}' abc
lishan 1 66 haha
zhaojing 2 78 enen
wangxuan 3 34 hehe
yangwei 4 45 wowo
取出文件中第一列以l开头n结尾的哪一行
[root@lishan ~]# awk '$1 ~ /^l....n$/' abc
lishan 1 66 haha
lishan 5 67 loulou
在文件第三列查找数字(66或者78)的哪一行并打印
[root@lishan ~]# awk '$3 ~ /(66|78)/' abc
lishan 1 66 haha
zhaojing 2 78 enen
查找文件以l开头的哪一行并打印
[root@lishan ~]# awk '/^l/' abc
lishan 1 66 haha
lishan 5 67 loulou
取出文件中以a结尾的哪一行
[root@lishan ~]# awk '/a$/' abc
lishan 1 66 haha
取出文件名
[root@lishan ~]# awk 'END{print FILENAME}' passwd
passwd
取出文件总行数
[root@lishan ~]# cat passwd |wc -l
31
[root@lishan ~]# awk 'END{print FNR}' passwd
31
取出文件的总列数,和行数
[root@lishan ~]# awk '{print NF,NR,$0}' abc
4 1 lishan 1 66 haha
4 2 zhaojing 2 78 enen
4 3 wangxuan 3 34 hehe
4 4 yangwei 4 45 wowo
4 5 lishan 5 67 loulou