awk格式化
利用awk中的printf动作,即可对文本进行格式化输出,printf动作的用法与print命令的用法非常相似,只是有略微的不同而已,不过,我们还是从最简单的示例开始看起,首先对比一下print动作与printf动作的区别,示例如下
[root@server01 ~]# awk '{print $1}' test1 abc 8ua [root@server01 ~]# awk '{printf $1}' test1 abc8ua[root@server01 ~]#
没错,printf动作与printf命令一样,都不会输出换行符,默认会将文本输出在一行里面。
[root@server01 ~]# awk '{printf "%s\n",$1}' test1 abc 8ua
指定的"格式"与列($1)之间需要用"逗号"隔开,而使用printf命令时,指定的格式与传入的文本不需要使用"逗号"隔开
[root@server01 ~]# printf "%s\n" teststring teststring
[root@server01 ~]# printf "%s\n" 1 2 3 4 5 6 1 2 3 4 5 6
在awk中,我们则不能这样使用,在awk中,格式替换符的数量必须与传入的参数的数量相同,换句话说,格式替换符必须与需要格式化的参数一一对应
[root@server01 ~]# awk 'BEGIN{printf "%s\n",1,2,3,4,5}' 1 [root@server01 ~]# awk 'BEGIN{printf "%s\n%s\n%s\n%s\n%s\n",1,2,3,4,5}' 1 2 3 4 5
我们来总结一下,在awk中使用printf动作时,需要注意以下3点。 1)使用printf动作输出的文本不会换行,如果需要换行,可以在对应的"格式替换符"后加入"\n"进行转义。 2)使用printf动作时,"指定的格式" 与 "被格式化的文本" 之间,需要用"逗号"隔开。 3)使用printf动作时,"格式"中的"格式替换符"必须与 "被格式化的文本" 一一对应。
[root@server01 ~]# awk '{printf "第一列:%s 第二列:%s\n",$1,$2}' test1 第一列:abc 第二列:123 第一列:8ua 第二列:456
[root@server01 ~]# awk '{printf "第一列:%s\t第二列:%s\n",$1,$2}' test1 第一列:abc 第二列:123 第一列:8ua 第二列:456
[root@server01 ~]# awk -v FS=":" 'BEGIN{printf "%-10s\t%s\n","用户名称","用户ID"} {printf "%-10s\t%s\n",$1,$3}' /etc/passwd
用户名称 用户ID
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
operator 11
games 12
ftp 14
nobody 99
systemd-network 192
dbus 81
polkitd 999
sshd 74
postfix 89
chrony 998
ntp 38
tss 59