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
",$1}' test1
abc
8ua

指定的"格式"与列($1)之间需要用"逗号"隔开,而使用printf命令时,指定的格式与传入的文本不需要使用"逗号"隔开

[root@server01 ~]# printf "%s
" teststring
teststring
[root@server01 ~]# printf "%s
" 1 2 3 4 5 6 
1
2
3
4
5
6

在awk中,我们则不能这样使用,在awk中,格式替换符的数量必须与传入的参数的数量相同,换句话说,格式替换符必须与需要格式化的参数一一对应

[root@server01 ~]# awk 'BEGIN{printf "%s
",1,2,3,4,5}'
1
[root@server01 ~]# awk 'BEGIN{printf "%s
%s
%s
%s
%s
",1,2,3,4,5}'
1
2
3
4
5
我们来总结一下,在awk中使用printf动作时,需要注意以下3点。

1)使用printf动作输出的文本不会换行,如果需要换行,可以在对应的"格式替换符"后加入"
"进行转义。

2)使用printf动作时,"指定的格式""被格式化的文本" 之间,需要用"逗号"隔开。

3)使用printf动作时,"格式"中的"格式替换符"必须与 "被格式化的文本" 一一对应。
[root@server01 ~]# awk '{printf "第一列:%s   第二列:%s
",$1,$2}' test1
第一列:abc   第二列:123
第一列:8ua   第二列:456
[root@server01 ~]# awk '{printf "第一列:%s	第二列:%s
",$1,$2}' test1
第一列:abc     第二列:123
第一列:8ua     第二列:456

[root@server01 ~]# awk -v FS=":" 'BEGIN{printf "%-10s %s ","用户名称","用户ID"} {printf "%-10s %s ",$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

原文地址:https://www.cnblogs.com/liujunjun/p/14190061.html