numfmtで数字を読みやすく(その2)

引き続きnumfmtコマンドです。

–toオプションで、バイトの単位変換ができます。
1024 単位の変換なら、–to=iecを指定します。
1024 Byte、1024 * 1024 Byteをそれぞれ単位変換すると、

takk@deb9:~/tmp$ numfmt --to=iec 1024
1.0K
takk@deb9:~/tmp$ numfmt --to=iec `expr 1024 \* 1024`
1.0M
takk@deb9:~/tmp$ 

結構大きな単位に対応しているようです。私はP(ペタ)より上は知りませんでした。

takk@deb9:~/tmp$ for i in 1 2 3 4 5 6 7;do numfmt --to=iec `ruby -e "p 1024 ** $i"`;done
1.0K
1.0M
1.0G
1.0T
1.0P
1.0E
1.0Z
takk@deb9:~/tmp$ 

国際単位系(1000単位)なら、–to=siを指定します。

takk@deb9:~/tmp$ numfmt --to=si 1024
1.1K
takk@deb9:~/tmp$ numfmt --to=si `expr 1024 \* 1024`
1.1M
takk@deb9:~/tmp$ 

変換したい値は、標準入力で与えてやればよいので、例えば以下のようなファイルがあったとして、読みやすい単位に変換したい場合は、

takk@deb9:~/tmp$ truncate -s 1024 a.bin
takk@deb9:~/tmp$ wc -c a.bin
1024 a.bin
takk@deb9:~/tmp$ 

そのままnumfmtに渡せばよいです。

takk@deb9:~/tmp$ wc -c a.bin | numfmt --to=iec
1.0K a.bin
takk@deb9:~/tmp$ 

numfmtが単位変換する対象が、一番最初の列のため、このようにシンプルに指定できます。

全フィールドを変換しようとすると、当然エラーになりますので、

takk@deb9:~/tmp$ wc -c a.bin | numfmt --to=iec --field -
1.0K numfmt: invalid number: `a.bin'
takk@deb9:~/tmp$ 

回避するには、–invalidオプションでignoreを指定すればよいです。

takk@deb9:~/tmp$ wc -c a.bin | numfmt --to=iec --field - --invalid ignore
1.0K a.bin
takk@deb9:~/tmp$ 

ではls -lの結果をnumfmtで変換してみましょう。

takk@deb9:~/tmp$ ls -l a.bin
-rw-r--r-- 1 takk takk 1024  5月 13 22:32 a.bin
takk@deb9:~/tmp$ 
takk@deb9:~/tmp$ ls -l a.bin | numfmt --to=iec --field 5
-rw-r--r-- 1 takk takk 1.0K  5月 13 22:32 a.bin
takk@deb9:~/tmp$ 

まあ、lsの場合は、-hオプションがあり、同じ変換をlsがやってくれるので、numfmtの出番はないですけどね。

takk@deb9:~/tmp$ ls -lh a.bin
-rw-r--r-- 1 takk takk 1.0K  5月 13 22:32 a.bin
takk@deb9:~/tmp$ 

statでもやってみます。

takk@deb9:~/tmp$ stat a.bin
  File: a.bin
  Size: 1024      	Blocks: 0          IO Block: 4096   通常ファイル
Device: 801h/2049d	Inode: 546902      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-05-13 22:32:27.257000000 +0900
Modify: 2018-05-13 22:32:13.441000000 +0900
Change: 2018-05-13 22:32:13.441000000 +0900
 Birth: -
takk@deb9:~/tmp$ 

Sizeの表示、1024を、numfmtで変換したいと思います。

takk@deb9:~/tmp$ stat a.bin | numfmt --to=iec --field 2 --invalid ignore
  File: a.bin
  Size: 1.0K      	Blocks: 0          IO Block: 4096   通常ファイル
Device: 801h/2049d Inode: 546902      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    takk)   Gid: ( 1000/    takk)
Access: 2018-05-13 22:32:27.257000000 +0900
Modify: 2018-05-13 22:32:13.441000000 +0900
Change: 2018-05-13 22:32:13.441000000 +0900
 Birth: -
takk@deb9:~/tmp$ 

2列目の表示に関して、2行目の1024は、数字のみで構成されていました。
一方2行目以外は、数字以外の混合値でしたので、これをnumfmtで変換すると無視され、1024だけが1.0Kに変換されたというわけです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA