web-dev-qa-db-ja.com

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を使用するときにオプションはありますか?

2
drenerd

まだ解決策がないので、以下のようにsedを使ってみました。

df | sed -r ':L;s=\b([0-9]+)([0-9]{3})\b=\1,\2=g;t L'

動作しますが、配置が悪いため、複数行の結果は良くありません。

しかし、悲しいことに、私はしばらくの間この行を使用する必要があります。

1
drenerd

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で設定することにより、そこにある任意の1000形式に変更できます。数字を右揃えにしたくない場合、またはawkにそのオプションがない場合(Ubuntuのデフォルトのオプションのように)、-Rオプションを削除することもできます。

function gensub never definedエラーが発生した場合は、 このバグ が原因です。これはgawkをインストールすることで解決できます。または、区切り文字をタブではなくスペースに変更します

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から直接列を整列することもできますが、十分に予約する必要があります各列のスペース

1
phuclv