shell 中的 printf 是生成结构化报表最可靠的方式,支持列对齐、精度控制和格式统一,不自动换行,比 echo 更精准,比 awk 更轻量。

Shell 中的 printf 是生成结构化报表最可靠的方式,尤其适合对齐列、控制精度和统一格式的场景。它不自动换行、支持宽度/对齐/小数位控制,比 echo 更精准,也比纯 awk 或外部工具更轻量。
用 %- 宽度 控制列对齐
报表的核心是视觉对齐。用 %-10s(左对齐、10字符宽)、%8d(右对齐、8字符宽)可强制字段占位,空格自动填充:
-
printf "%-12s %-6s %6.2f\n" "姓名" "性别" "体重"→ 标题行对齐 -
printf "%-12s %-6s %6.2f\n" "张三" "男" 66.1234→ 数据行自动对齐到对应列 - 若字符串超宽(如姓名“欧阳修远”),
printf仍完整输出,不会截断
统一数字精度与单位格式
财务或统计类报表常需固定小数位、千分位或符号标识。虽然 Shell 原生不支持千分位,但可通过格式符控制关键精度:
-
%.2f强制保留两位小数:printf "金额: %.2f 元\n" 1234.5→金额: 1234.50 元 -
%+d显示正负号:printf "变化: %+d\n" -5→变化: -5;printf "变化: %+d\n" 3→变化: +3 - 整数用
%d,避免浮点数误输出(如printf "%d\n" 3.9截断为3)
批量输出多行数据(重用格式串)
当处理数组或循环数据时,printf 会自动循环复用格式串,无需显式写多次 printf:
names=("Alice" "Bob" "Charlie"); ages=(28 35 22); for i in ${!names[@]}; do printf "%-10s %3d\n" "${names[i]}" "${ages[i]}"; done- 也可直接传多个参数:
printf "%s:%d\n" "A" 1 "B" 2 "C" 3→ 输出三行,格式串被反复使用 - 注意:参数个数应为格式说明符个数的整数倍,否则多余参数被忽略,不足则补空
嵌入转义与分隔符增强可读性
报表不只是文字堆砌,适当换行、缩进和分隔线能显著提升可读性:
- 用
\n分隔区块:printf "=== 用户统计 ===\n"; printf "%-8s %4s\n" 姓名 年龄; printf "%-8s %4d\n" 张三 28 - 用
\t或空格做内部缩进(慎用\t,因终端制表宽度不一,推荐空格对齐) - 打印分隔线:
printf "%s\n" "$(printf '=%.0s' {1..40})"→ 生成 40 个等号横线











