awk学习手记4-print、printf、
前面学习的一些内容让我们认识到awk一些基础的的文本匹配及操作能力。现在我们开始更加深入的学习其最强大的功能-格式化。
在之前的实例中,我们通常使用print来输出文本,但是print只能够实现简单的文本的输出功能,并不能对文本格式进行改变。如果想要改变文本格式,则需要使用printf动作。
printf动作和C语言中的printf函数很相似,只是有略微的不同,下面我们开始在具体的示例中学习printf动作。
作为孪生兄弟,我们首先看一下awk的print动作和printf动作的区别:
[root@my127 awk]# awk '{print $1}' 4.txt
root
123
WWW
[root@my127 awk]# awk '{printf $1}' 4.txt
root123WWW[root@my127 awk]#
printf动作和C语言中的printf命令一样,都不会输出换行符,默认会在文本输出在同一行。和C中printf命令一样,awk的printf动作也有“格式替代符”
[root@my127 awk]# awk ‘{printf “%s\n” ,$1}’ 4.txt
root
123
WWW
**注意:awk中printf指定的“格式”和文本之间需要用逗号,隔开!**实际上我们建议awk语句program中所有的‘分子’都相互隔开。
printf动作和printf命令第二个不同点是:printf命令可以只用一个格式替代符,也就是说当语句中传入了多个参数,那么这多个参数可以重复使用同一个替代符,示例:
[root@my127 awk]# printf "%s\n" 1 2 3 4 5
1
2
3
4
5
但是在awk中,我们的格式替代符数量必须等于传参数量,换句话说,格式替代符必须与参数一一对应,示例如下:
[root@my127 awk]# awk 'BEGIN{printf "%s\n" ,1,2,3,4,5}'
1
[root@my127 awk]# awk 'BEGIN{printf "%s\n%s\n%s\n%s\n%s\n" ,1,2,3,4,5}'
1
2
3
4
5
总结一下printf动作使用须知:
1、使用printf动作不会换行,如果需要换行可以在对应的“格式替代符”后面加入“\n”进行转义换行。
2、使用printf动作时,需要将“格式”与“被格式化的文本”用逗号隔开。
3、使用printf动作时,“格式”中的格式替代符必须与被格式化的文本一一对应。
格式化举例
例一、
利用printf对文本的每一列进行格式化
[root@my127 awk]# cat 7.txt
root test prom tmp
123 456 78900 00
[root@my127 awk]# awk '{printf "第一列:%s 第二列:%s\n",$1,$2}' 7.txt
第一列:root 第二列:test
第一列:123 第二列:456
例二、
与FS结合使用,先来指定分隔符,在进行格式化。
FS负责切割,printf负责格式化:
[root@my127 awk]# cat 6.txt
qwe#rty#yui#iop
asd#fgh#jkl#zxc
mnb#plm#ijn#awr
[root@my127 awk]# awk -v FS='#' '{printf "第一列:%s 第二列:%s\n",$1,$2}' 6.txt
第一列:qwe 第二列:rty
第一列:asd 第二列:fgh
第一列:mnb 第二列:plm
例三、
利用awk的begin模式,结合printf动作,输出一个表格样式的文本。
[root@my127 awk]# awk -v FS='#' 'BEGIN{printf "%-10s\t %s\n","用户名称","用户ID"}{printf "%-10s\t %s\n",$1,$2}' 6.txt
用户名称 用户ID
qwe rty
asd fgh
mnb plm
生产环境下,printf动作使用频率超高,需要多用多练习,才能灵活使用printf动作。