printf - 格式化和打印数据
与本章中的其他命令不同, 的printf command 不用于管道(它不接受标准输入),也不直接在命令行上找到频繁的应用程序(它主要用于脚本)。 那么为什么重要呢? 因为它被广泛使用。
printf(来自短语“print formatted”)最初是为 C 编程语言开发的,并已在包括 shell 在内的许多编程语言中实现。 事实上,在 bash 中,printf 是一个内置函数。
printf 的工作方式如下:
打印“格式= 参数
该命令被赋予一个包含格式描述的字符串,然后将其应用于参数列表。 格式化的结果被发送到标准输出。 这是一个简单的例子:
[我@linuxbox ~]$ printf "我格式化了字符串:%s\n" foo
我格式化了字符串:foo
[我@linuxbox ~]$ printf "我格式化了字符串:%s\n" foo
我格式化了字符串:foo
格式字符串可能包含文字文本(如“I formatted the string:”)、转义序列(如 \n, 换行符),以及以 % 字符,被称为 转换规格. 在上面的例子中,转换规范 %s 用于格式化字符串“foo”并将其放置在命令的输出中。 又来了:
[我@linuxbox ~]$ printf "我将 '%s' 格式化为字符串。\n" foo
我将 'foo' 格式化为字符串。
[我@linuxbox ~]$ printf "我将 '%s' 格式化为字符串。\n" foo
我将 'foo' 格式化为字符串。
如我们所见, %s 转换规范被命令输出中的字符串“foo”替换。 s 转换用于格式化字符串数据。 对于其他类型的数据,还有其他说明符。 下表列出了常用的数据类型:
表 21-4:常用 printf 数据类型说明符
说明符 说明
说明符 说明
d 将数字格式化为有符号十进制整数。
f 格式化并输出一个浮点数。
o 将整数格式化为八进制数。
s 格式化字符串。
x 在需要时使用小写 af 将整数格式化为十六进制数。
X 与...一样 x 但使用大写字母。
% 打印文字 % 符号(即指定“%%”)
我们将演示每个转换说明符对字符串“380”的影响:
[我@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
380 380
380、380.000000、574、380、17C、17C
[我@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
380 380
380、380.000000、574、380、17C、17C
由于我们指定了六个转换说明符,我们还必须提供六个参数
printf 处理。 六个结果显示了每个说明符的效果。
可以将几个可选组件添加到转换说明符中以调整其输出。 完整的转换规范可能包括以下内容:
%[标志][宽度][。精确]转换_规范
使用多个可选组件时,必须按上面指定的顺序出现才能正确解释。 以下是对每个的描述:
表 21-5: printf 转换规范组件
组件说明
组件说明
flags 有五种不同的标志:
# – 使用“替代格式”进行输出。 这因数据类型而异。 对于 o(八进制数)转换,输出前缀为
0. 对于 x 和 X(十六进制数)转换,输出分别以 0x 或 0X 为前缀。
0–(零)用零填充输出。 这意味着该字段将填充前导零,如“000380”。
- - (破折号)左对齐输出。 默认情况下, printf 右对齐输出。
' ' - (空格)为正数产生前导空格。
+ –(加号)符号正数。 默认情况下,仅 printf
符号负数。
宽度 指定最小字段宽度的数字。
。精确 对于浮点数,指定小数点后输出的精度位数。 对于字符串转换, 精确 指定要输出的字符数。
以下是一些不同格式的示例:
表 21-6:打印转换规范示例
争论 | 格式 | 结果 | 笔记 |
380 | “%d” | 380 | 简单格式化 |
整数。 | |||
380 | “%#X” | 0x17c | 整数格式为 |
十六进制数使用 | |||
“替代格式”标志。 | |||
380 | “%05d” | 00380 | 整数格式为 |
前导零(填充) | |||
和最小字段宽度 | |||
五个字符。 | |||
380 | “%05.5f” | 380.00000 | 数字格式为 |
浮点数与 | |||
填充和五位小数 | |||
精确的地方。 自从 | |||
指定的最小值 | |||
字段宽度 (5) 小于 | |||
实际宽度 | |||
格式化的数字, | |||
填充没有效果。 | |||
380 | “%010.5f” | 0380.00000 | 通过增加 |
最小字段宽度为 10 | |||
填充现在可见。 | |||
380 | “%+d” | +380 | + 标志表示积极 |
数。 | |||
380 | “%-d” | 380 | - 标志左对齐 |
格式。 |
abcdefghijk | “%5s” | abcedfghijk | 以最小字段宽度格式化的字符串。 |
abcdefghijk | “%.5s” | ABCDE | 通过对字符串应用精度,它会被截断。 |
同样, 的printf 主要用于格式化表格数据的脚本中,而不是直接在命令行中使用。 但是我们仍然可以展示如何使用它来解决各种格式问题。 首先,让我们输出一些由制表符分隔的字段:
[我@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
字符串1 字符串2 字符串3
[我@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
字符串1 字符串2 字符串3
通过插入 \t (选项卡的转义序列),我们达到了预期的效果。 接下来,一些格式整齐的数字:
[我@linuxbox ~]$ printf“行:%05d %15.3f 结果:%+15d\n”1071 3.14156295 32589
线路:01071 3.142 结果:+32589
[我@linuxbox ~]$ printf“行:%05d %15.3f 结果:%+15d\n”1071 3.14156295 32589
线路:01071 3.142 结果:+32589
这显示了最小字段宽度对字段间距的影响。 或者如何格式化一个小网页:
[我@linuxbox ~]$ 打印输出“ \n\t \n\t\t %s \n
\t \n\t \n\t\t %s \n\t \n \n" "页面标题" "页面内容"
页面标题
页面内容
[我@linuxbox ~]$ 打印输出“ \n\t \n\t\t %s \n
\t \n\t \n\t\t %s \n\t \n \n" "页面标题" "页面内容"
页面标题
页面内容