df
命令为我提供了很好的信息,我喜欢以 KB 为单位查看信息。但我需要每 3 位数字使用千位分隔符(又称逗号),因为数字总是很大。
ex> df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 20157076 2982212 16970148 15% /
none 4 0 4 0% /sys/fs/cgroup
/dev/sda2 27206836656 27189604228 17113644 100% /volume1
iwant> df
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 20,157,076 2,982,212 169,70,148 14.8% /
none 4 0 4 0% /sys/fs/cgroup
/dev/sda2 27,206,836,656 27,189,604,228 17,113,644 100% /volume1
我讨厌-h
(人类可读)选项,因为它会让一切变得不合逻辑。特别是每个数字之间的单位字节会有所不同。我希望每个数字都在同一个单位上。
我需要的只是一个千位分隔符...使用时有什么选项吗df
?
答案1
您可以使用awk
使用以下方式格式化数字%'d
然后使用column
格式化表格
$ df | LC_ALL=en_US.UTF-8 awk '{
if (NR == 1) { print gensub(/ +/, "\t", "g") } else {
printf("%s\t%'"'"'d\t%'"'"'d\t%'"'"'d\t%d\t%s\n", $1, $2, $3, $4, $5, $6)
} }' | column -t -R 2,3,4,5 -s$'\t'
Filesystem 1K-blocks Used Available Use% Mounted on
dev 1,002,104 0 1,002,104 0 /dev
run 1,011,880 1,060 1,010,820 1 /run
/dev/sda2 36,285,808 17,358,124 17,054,752 51 /
tmpfs 1,011,880 0 1,011,880 0 /dev/shm
tmpfs 1,011,880 0 1,011,880 0 /sys/fs/cgroup
tmpfs 1,011,880 8,300 1,003,580 1 /tmp
/dev/sda1 306,584 264 306,320 1 /boot/efi
tmpfs 202,376 28 202,348 1 /run/user/1000
/dev/sr0 58,122 58,122 0 100 /run/media/mypc/myfolder
通过设置区域设置,LC_ALL
您可以更改为任何可用的数千种格式。-R
如果您不想,也可以删除该选项右对齐数字或你的column
版本没有该选项(例如 Ubuntu 上的默认选项)
如果你收到function gensub never defined
错误,那么这是因为这个错误可以通过安装解决呆呆地。或者将分隔符更改为空格而不是制表符:
df | LC_ALL=en_US.UTF-8 awk '{
if (NR == 1) { print } else {
printf("%s\t%'"'"'d\t%'"'"'d\t%'"'"'d\t%d\t%s\n", $1, $2, $3, $4, $5, $6)
} }' | column -t
如果你想获得 KB 值,你需要除以相应的列
df | LC_ALL=en_US.UTF-8 awk -v K=1024 '{
if (NR == 1) { print gensub(/ +/, "\t", "g") }
else { printf("%s\t%'"'"'d\t%'"'"'d\t%'"'"'d\t%d\t%s\n",
$1, $2/K, $3/K, $4/K, $5, $6) } }
' | column -t -R 2,3,4,5 -s$'\t'
如果你想获得浮点值,只需更改%d
为%f
df | LC_ALL=en_US.UTF-8 awk -v K=1024 '{
if (NR == 1) { print gensub(/ +/, "\t", "g") }
else { printf("%s\t%'"'"'0.2f\t%'"'"'0.2f\t%'"'"'0.2f\t%d\t%s\n",
$1, $2/K, $3/K, $4/K, $5, $6) } }
' | column -t -R 2,3,4,5 -s$'\t'
awk
当然,你也可以直接使用字段宽度选项来对齐列,例如printf "%-10d %10d\n", $1, $2
无需column
,但你必须为每列保留足够的空间
答案2
在 Debian 和许多衍生发行版中numfmt
其中的一部分coreutils
你可以使用
$ df | LC_ALL=en_US.UTF-8 numfmt --header --field 2-4 --grouping 文件系统 1K 块已使用可用使用率% 已安装于 tmpfs 399,676 1,872 397,804 1% /运行 /dev/sda2 85,655,680 10,429,248 70,832,348 13% / tmpfs 1,998,364 0 1,998,364 0%/dev/shm tmpfs 5,120 4 5,116 1% /运行/锁定 tmpfs 4,096 0 4,096 0%/sys/fs/cgroup /dev/sda1 523,248 8,020 515,228 2%/boot/efi tmpfs 399,672 104 399,568 1%/运行/用户/1000
不幸的是,尽管numfmt
确实尝试保留列,但如果在插入组分隔符后行长出现较大变化(如上所示),则它会失败。因此有时您可能仍需要使用column
df | LC_ALL=en_US.UTF-8 numfmt --header --field 2-4 --grouping | column -t -R 2,3,4,5
该-R 2,3,4,5
选项用于右对齐,但有些column
版本(例如 Ubuntu 中的版本)column
来自util-linux
而不是来自bsdmainutils
) 不支持,因此您需要将其删除。或者,您可以安装列来bsdmainutils
获取该功能
答案3
因为还没有解决方案,所以我尝试使用sed
如下方法:
df | sed -r ':L;s=\b([0-9]+)([0-9]{3})\b=\1,\2=g;t L'
它可以起作用,但由于对齐不良,多线的结果看起来不太好。
但很遗憾,我暂时只能用这条线路了。