● 使用多个字段分隔符
新版本的Awk提供指定多个输入字段分隔符。如果有多个字符被用于字段分隔符FS,则FS对应是一个正则表达式字符串,并且被括在方括号中([ ])。
范例 3-8
首先先创建实验数据
[root@localhost script]# awk -F ':' '{print NR,$0}' /etc/passwd > passwd_1
[root@localhost script]# ls
passwd
passwd_1
[root@localhost script]# cat passwd_1
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
… … …
### 解析 ###
通过awk命令以“:”作为输入字段分隔符,打印/etc/passwd文件的每条记录的记录号和对应的记录,并重定向到/root/script/passwd_1文件中。
范例 3-9
[root@localhost script]# awk -F '[ :\t]' '{print $1,$2,$3}' passwd_1
1 root x
2 bin x
3 daemon x
4 adm x
5 lp x
6 sync x
7 shutdown x
… … …
### 解析 ###
-F选项后跟了一个位于方括号中的正则表达式。当遇到空格、冒号或制表符时,awk会把它当成字段分隔符。正则表达式要在两个引号里面,这样才不会给shell当成自己的元字符而给解析了。
|
● 输出字段分隔符
默认的输出字段分隔符是单个空格,被保存在awk内置变量OFS中。之前使用的print函数把数据输出到屏幕时,print用于分隔字段的逗号,在输出时转换成OFS的值。如果使用OFS的默认值时,则像
范例 3-9 把$1,$2,$3之间都用单个空格来分隔。如果使用print函数输出时,不在两个字段间加入逗号,则输出的字段会连在一起。
范例 3-10
在BEGIN语句中指定OFS的值,改变输出字段分隔符
[root@localhost script]# awk -F ':' 'BEGIN {OFS="\t*\t"}{print $1,$2,$7}' passwd
root
*
x
*
/bin/bash
bin
*
x
*
/sbin/nologin
daemon
*
x
*
/sbin/nologin
adm
*
x
*
/sbin/nologin
lp
*
x
*
/sbin/nologin
sync
*
x
*
/bin/sync
… … …
### 解析 ###
在BEGIN语句中指定OFS的值为两个制表符中间夹着个星号“\t*\t”,所以输出的字段之间就以两个制表符中间夹着一个星号作为分隔符。
|