awk 功能更强大,可以分段,针对段进行操作
注:特殊符号不需要转义,但不支持{}
-F 分隔符
OFS 打印出分隔符
打印第3,4段
[root@wy ~]# awk -F ':' '{print $3,$4}' /etc/passwd
0 0
1 1
2 2
打印分隔符
[root@wy ~]# awk -F ':' 'OFS="#" {print $3,$4}' /etc/passwd
0#0
1#1
2#2
匹配字符
[root@wy ~]# awk '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
特殊符号不需要转义
[root@wy ~]# awk '/root|wyy/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
wyy:x:500:500::/home/wyy:/bin/bash
wyy2:x:501:502::/home/wyy2:/bin/bash
[root@wy ~]# awk '/r+o/' /etc/passwd
[root@wy ~]# awk '/r?o/' /etc/passwd
[root@wy ~]# awk '/r*o/' /etc/passwd
匹配第一段
[root@wy ~]# awk -F ':' '$1~/r*o/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
匹配第一段,打印第3段
[root@wy ~]# awk -F ':' '$1~/r*o/ {print $3}' /etc/passwd
0
2
6
多次匹配(;分隔)
[root@wy ~]# awk -F ':' '$1~/r*o/ {print $1,$3}; $1~/wyy/ {print $1,$3}' /etc/passwd
root 0
daemon 2
shutdown 6
operator 11
gopher 13
nobody 99
postfix 89
haldaemon 68
nfsnobody 65534
wyy 500
wyy2 501
解释说明 :
若匹配的两个在同一行中,则结果会显示两次。(因为有两个过滤器,都要走一遍。)
条件操作符
匹配$1等于root的
[root@wy ~]# awk -F ':' '$1=="root"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
匹配$1等于root的或者$7匹配nologin的
[root@wy ~]# awk -F ':' '$1=="root" || $7~/nologin/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
匹配$3>=500的
[root@wy ~]# awk -F ':' '$3>=500' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wyy:x:500:500::/home/wyy:/bin/bash
wyy2:x:501:502::/home/wyy2:/bin/bash
user2:x:506:501::/home/user2:/bin/bash
若500加上双引号,则是扫完ASC码比较的
匹配不等于的
[root@wy ~]# awk -F ':' '$7!="/sbin/nologin"' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
不匹配的指定的
[root@wy ~]# awk -F ':' '$7!~/nologin/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
两个段的比较大小
[root@wy ~]# awk -F ':' '$3<$4' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
一个复杂的格式
awk -F ':' 'BEGIN{OFS=“:”} {if(条件){语句1;语句2;语句3}} END{语句}'
内置变量
NR 表示行
NF 表示一行的段数
OFS 显示指定分隔符
打印第10行
[root@wy ~]# awk -F ':' 'NR==10' /etc/passwd
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
打印第10行指定的段
[root@wy ~]# awk -F ':' 'NR==10 {print $1,$7}' /etc/passwd
uucp /sbin/nologin
if条件的
[root@wy ~]# awk -F ':' 'OFS=":" {if (NR==10) print $1,$7}' /etc/passwd
uucp:/sbin/nologin
[root@wy ~]# awk -F ':' '{print NF}' /etc/passwd
7
7
[root@wy ~]# awk -F ':' '{if (NF==7) print $1}' /etc/passwd
root
bin
[root@wy ~]# awk -F ':' '{print $NR,$NF}' /etc/passwd
root /bin/bash
x /sbin/nologin
2 /sbin/nologin
4 /sbin/nologin
lp /sbin/nologin
/sbin /bin/sync
/sbin/shutdown /sbin/shutdown
/sbin/halt
/sbin/nologin
解释说明:
可以看到第8行呢,就跟上面显示的不一样了。
NR==1,$NF是第一行第一段,$NF是第一行最后一段
NR==2,$NF是第二行第二段,$NF是第二行最后一段
以此类推……
[root@wy ~]# awk -F ':' 'OFS=":" {$7=$3+$4; print $0}' /etc/passwd ### $0表示一行
root:x:0:0:root:/root:0
bin:x:1:1:bin:/bin:2
daemon:x:2:2:daemon:/sbin:4
adm:x:3:4:adm:/var/adm:7
求和
[root@wy ~]# awk -F ':' '{(sum=sum+$3)};END {print sum}' /etc/passwd
68460