在Linux命令行环境下处理系统信息或日志文本时,原始输出往往排列杂乱,可读性不佳。此时,对输出结果进行格式化就显得尤为重要。
以查看磁盘使用情况的 df -h 命令为例,其原始输出与使用awk简单提取字段后的对比如下:

可以看到,未经格式化的awk输出虽然提取了关键数据,但列与列之间紧密相连,视觉上非常混乱。通过printf函数进行格式化后,可读性将大幅提升:
df -h|awk '{printf "%-40s%-8s%-8s%-5s%-20s\n",$1,$2,$4,$5,$6}'
df -h|awk '{printf "%-40s|%-8s|%-8s|%-5s|%-20s\n",$1,$2,$4,$5,$6}'

然而,当输出的表头包含中文时,直接使用上述方法会出现列无法对齐的问题,这是因为中文字符的显示宽度通常为英文字符的两倍。

解决方案是将标题行与数据行分开处理,并为它们指定不同的字段宽度,这在编写复杂的Shell脚本时是一个实用技巧:
df -h|head -1|awk '{printf "%-19s|%-6s|%-6s|%-3s|%-17s\n",$1,$2,$4,$5,$6}';df -h|tail -n +2|awk '{printf "%-23s|%-8s|%-8s|%-5s|%-20s\n",$1,$2,$4,$5,$6}'
# 或微调参数以更好适配
df -h|head -1|awk '{printf "%-19s|%-6s|%-6s|%-4s|%-17s\n",$1,$2,$4,$5,$6}';df -h|tail -n +2|awk '{printf "%-23s|%-8s|%-8s|%-6s|%-20s\n",$1,$2,$4,$5,$6}'

实际应用中,你需要根据具体字段的长度来调整宽度参数,还可以结合grep命令过滤,只输出关键的文件系统信息。
对于CPU使用率的监控,格式化输出相对简单:

而内存使用情况的展示则稍复杂一些,如果不仅要显示使用率,还要包含总大小、已用容量等信息,就需要更精细的awk命令来处理。

核心格式化工具详解
在Shell中,主要借助echo和printf来实现丰富的格式化输出。
1. echo命令:颜色与特效
echo命令配合-e参数可以输出带颜色、闪烁等特效的文本,常用于脚本中的高亮提示。
基本格式为:
echo -e "\033[字背景颜色;文字颜色m字符串\033[0m"
例如,输出红底黄字:
echo -e "\033[41;33m 警告信息 \033[0m"
颜色代码参考:
- 字颜色(30-37):
30黑,31红,32绿,33黄,34蓝,35紫,36青,37白。
- 背景色(40-47):
40黑,41红,42绿,43黄,44蓝,45紫,46青,47白。
控制选项:
\033[0m:关闭所有属性
\033[1m:设置高亮度
\033[4m:下划线
\033[5m:闪烁
\033[7m:反显(前景背景色互换)
应用实例,输出一个闪烁的红色停止提示:
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"

2. printf函数:精准格式控制
printf函数可以精确控制输出的格式,既能独立使用,也是awk命令进行格式化输出的黄金搭档。与默认换行的print不同,printf需要明确指定格式(format)并且不会自动添加换行符。
基本格式指示符:
%s:字符串
%d, %i:十进制整数
%f:浮点数
%c:单个字符
%%:输出%自身
常用修饰符:
-:左对齐(默认右对齐)
+:显示数值的正负号
数字:指定最小字段宽度(如%10s)
.数字:指定精度(对于浮点数%.2f,或字符串最大长度%.5s)
在awk中的使用:
# 基本用法
awk -F ':' '{ printf("用户名:%-10s UID:%d\n", $1, $3) }' /etc/passwd
# 格式化浮点数,例如显示内存使用率
free | awk '/Mem:/ {printf("内存使用率:%.1f%%\n", $3/$2*100)}'
在纯Shell脚本中的使用:
# 格式化输出多个变量,保持表格对齐
printf "%-10s%-15s%-15s%-15s%-15s%-15s\n" ${date} ${line} ${file_num} ${datafile_num} ${totalcount} ${filespace}
掌握echo的颜色控制和printf的精准格式化,能让你在Linux运维和脚本编写中,轻松生成清晰、美观且信息突出的终端输出,极大提升工作效率和脚本的可读性。