numfmt 是一个强大的数字格式化工具,专门用于处理数字的单位转换和格式化输出。它在系统管理、数据处理和脚本编写中非常实用。
该命令是 GNU coreutils 包的一部分,通常预装在大多数 Linux 发行版中。
主要功能详解
1. 单位转换
支持多种单位系统间的转换:
- SI 单位制:基于10的幂次方 (K=10³, M=10⁶, G=10⁹)
- IEC 单位制:基于2的幂次方 (Ki=2¹⁰=1024, Mi=2²⁰, Gi=2³⁰)
- 自动检测 :使用
--from=auto可自动识别输入单位
2. 数字格式化
- 千位分隔符:支持不同地区的分隔符格式
- 小数位控制:可精确指定输出小数位数
- 对齐填充:可设置固定宽度并对齐输出
3. 进制转换
支持在以下进制间转换:
- 十进制 (默认)
- 十六进制 (需配合其他工具)
- 八进制 (需配合其他工具)
选项参数详解
| 选项 | 说明 | 示例值 |
|---|---|---|
--from |
输入单位 | auto, none, K, M, G, Ki, Mi, Gi |
--to |
输出单位 | auto, none, K, M, G, Ki, Mi, Gi |
--grouping |
启用分组 | 无参数 |
--format |
输出格式 | "%.2f", "%'d" |
--padding |
填充宽度 | 10, -10 (左/右对齐) |
--round |
舍入方法 | up, down, from-zero, towards-zero, nearest |
--suffix |
添加后缀 | "bytes", "B" |
--delimiter |
自定义分隔符 | "'", "," |
详细使用示例
1. 存储容量转换
bash
# 将字节转换为最合适的人类可读格式
numfmt --to=iec --format="%.1f" 4096
# 输出:4.0Ki
# 转换磁盘空间显示
df -B1 | numfmt --field=2-4 --to=iec --padding=10
2. 财务数字处理
bash
# 添加千位分隔符并保留2位小数
numfmt --grouping --format="%.2f" 1234567.891
# 输出:1,234,567.89
# 不同地区分隔符格式
LC_ALL=fr_FR.UTF-8 numfmt --grouping 1234567
# 输出:1 234 567
3. 脚本中的数字处理
bash
# 在脚本中转换内存值
mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
mem_gb=$(numfmt --from=Ki --to=Gi --round=nearest $mem_kb)
echo "系统内存: ${mem_gb}GB"
4. 自定义格式输出
bash
# 固定宽度右对齐
numfmt --format="%10.2f" 123.456
# 输出: 123.46
# 添加单位后缀
numfmt --to=iec --suffix="B" 1024
# 输出: 1KiB
典型应用场景
-
系统监控报告:
- 转换内存、磁盘使用量到易读格式
- 格式化网络流量统计数字
-
财务数据处理:
- 为金额数字添加分隔符
- 统一不同来源的数字格式
-
科学数据分析:
- 标准化实验数据单位
- 转换不同数量级的测量值
-
日志处理:
- 规范化日志中的数字字段
- 转换时间戳为可读格式
注意事项与技巧
-
版本兼容性:
- 部分高级功能需要 coreutils 8.21+
- 使用
numfmt --version检查版本
-
性能考虑:
- 处理大文件时建议结合
xargs - 批量处理可使用
--field选项指定列
- 处理大文件时建议结合
-
错误处理:
- 无效输入会返回非零退出码
- 使用
2>/dev/null忽略错误消息
-
环境变量影响:
- LC_NUMERIC 影响小数点和分隔符
- LC_ALL 会覆盖所有本地化设置
-
单位注意事项:
- 1KB = 1000B, 1KiB = 1024B
- 单位大小写敏感 (K≠k, B≠b)
进阶用法
bash
# 处理多列数据
ps -eo rss,pid,cmd | numfmt --header --field 1 --from-unit=1024 --to=iec
# 自定义转换规则
numfmt --from=si --to=none --format="%f" 1K | awk '{print $1*1.024}'
# 结合其他命令使用
find . -type f -printf "%s\n" | numfmt --to=iec --round=up | sort -h
numfmt 是处理数字格式化的瑞士军刀,掌握它可以让你的shell脚本和数据处理的专业度大幅提升。