是否可以在 Linux“df”命令的输出中添加千位逗号分隔符

是否可以在 Linux“df”命令的输出中添加千位逗号分隔符

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'

它可以起作用,但由于对齐不良,多线的结果看起来不太好。

但很遗憾,我暂时只能用这条线路了。

相关内容