awk '/^root/ {print $0}' /etc/passwd
结果: root:x:0:0:root:/root:/bin/bash # /^root/ 为正则过滤表达式,$0代表是逐行
2) FS 分隔符
awk 'BEGIN{FS=":"} /^root/ {print $1,$NF}' /etc/passwd
结果: root /bin/bash
注: FS为字段分隔符,默认是空格。因为passwd里是”:”分隔,所以需要修改默认分隔符。NF是字段总数,$0代表当前行记录,$1-$n是当前行各个字段对应值,$NF代表最后一列。
3) 记录条数(NR,FNR)
awk 'BEGIN{FS=":"}{print NR, $1, $NF, "\t", $0}' /etc/passwd
结果:
1 root /bin/bash root:x:0:0:root:/root:/bin/bash
2 daemon /bin/sh daemon:x:1:1:daemon:/usr/sbin:/bin/sh
3 bin /bin/sh bin:x:2:2:bin:/bin:/bin/sh
4 sys /bin/sh sys:x:3:3:sys:/dev:/bin/sh
5 sync /bin/sync sync:x:4:65534:sync:/bin:/bin/sync
........
awk 'BEGIN{FS=":"}/^s/{print NR, $1, $NF, "\t", $0}' /etc/passwd # 过滤以首字符”s“开头的所有行
结果:
4 sys /bin/sh sys:x:3:3:sys:/dev:/bin/sh
5 sync /bin/sync sync:x:4:65534:sync:/bin:/bin/sync
20 syslog /bin/false syslog:x:101:103::/home/syslog:/bin/false
........
注: NR得到当前记录所在行
4) 字段分隔符(OFS)
awk 'BEGIN{FS=":"; OFS="##"} /^root/ {print FNR, $1, $NF}' /etc/passwd
结果: 1##root##/bin/bash
注: OFS设置默认字段分隔符, FNR当前记录行
5) 行记录分隔符(ORS)
awk 'BEGIN{FS=":"; ORS="##"}{print FNR, $1, $NF}' /etc/passwd
结果: 1 root /bin/bash##2 daemon /bin/sh##3 bin /bin/sh##4 sys /bin/sh##5 sync /bin/sync##......
awk 'BEGIN{FS=":"; ORS="\n"}{print FNR, $1, $NF}' /etc/passwd # "/n" 是linux 中换行符
结果:
1 root /bin/bash
2 daemon /bin/sh
3 bin /bin/sh
4 sys /bin/sh
5 sync /bin/sync
.......
注: ORS默认是换行符,这里修改为:”##”,所有行之间用”##”分隔了
6) 参数获取(ARGC ,ARGV)
awk 'BEGIN{FS=":"; print "ARGC="ARGC; for(k in ARGV) {print k"="ARGV[k];}}' /etc/passwd
结果:
ARGC=2
0=awk
1=/etc/passwd
注: ARGC得到所有输入参数个数,ARGV获得输入参数内容是一个数组
7) 获得传入的文件名(FILENAME)
awk 'BEGIN{FS=":";}/^r/ {print FILENAME, "\t", $0}' /etc/passwd
结果:
/etc/passwd root:x:0:0:root:/root:/bin/bash
/etc/passwd rtkit:x:110:117:RealtimeKit,,,:/proc:/bin/false
注: FILENAME, $0-$N,NF 不能使用在BEGIN中,BEGIN中不能获得任何与文件记录操作的变量