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