UNIX/Linuxの部屋 numfmtコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド numfmt 数字・数値の整形・カンマ挿入・単位変換を行う このエントリーをはてなブックマークに追加

最終更新


numfmt コマンドは、12345678 などの数字文字列を 123K や 123M などと人間が読みやすく変換したり、1000 と 1024 の基数変換をしたりするコマンドである。

2013年にリリースされた Coreutils-8.22 で追加されたコマンドであるため、Ubuntu 16.04 や CentOS 7 など最近の Linux には標準で numfmt コマンドが含まれている。FreeBSD や macOS であれば coreutils をインストールするとよい。


numfmt コマンドの基本的な使い方
numfmt コマンドの典型的な使い方としては、下記のように数字の桁数が多く、ぱっと見では 何MB なのか 何GB なのかわからないときがある。
% du -s -b /usr/*
563590337 /usr/bin
21606184 /usr/include
1014659294 /usr/lib
2660623059 /usr/local
3784048 /usr/sbin
2484776917 /usr/share

そのような場合、numfmt コマンドに --to=iec を渡すことで、下記のように K・M・G 接頭辞を追加してくれる。
% du -s -b /usr/* | numfmt --to=iec
538M /usr/bin
21M /usr/include
968M /usr/lib
2.5G /usr/local
3.7M /usr/sbin
2.4G /usr/share

さらに、サイズ順にソートしたい場合は、sort -n で数値としてソートしてから numfmt コマンドで変換すればよい。
% du -s /usr/* | sort -n | numfmt --to=iec
3.7M /usr/sbin
21M /usr/include
538M /usr/bin
968M /usr/lib
2.4G /usr/share
2.5G /usr/local

ちなみに sort で -h または --human-numeric-sort オプションを使うことで、numfmt で変換した後の 123K、456M といった表記をソートすることも可能である。
% du -s /usr/* | numfmt --to=iec | sort -h


オプション --to: 出力形式を指定
▷ --to=[ユニット]
数値を出力する際の形式を指定する。[ユニット] には si・iec-i・iec などを指定する。
▷ --to=si
1,000 を K、1,000,000 を M、1,000,000,000 を G と表記する (SI 単位系の接頭辞)。
▷ --to=iec-i
1024 を Ki、1024*1024 を Mi、1024*1024*1024 を Gi と表記する (IEC:国際電気標準会議の接頭辞)。なお、Ki はキビ、Mi はメビ、Gi はギビと発音する。
▷ --to=iec
iec-i と同じく 1024 の単位とするが、K・M・G と表記する。
以下に例をあげる。
% echo 12345678 | numfmt --to=si
13M
% echo 12345678 | numfmt --to=iec-i
12Mi
% echo 12345678 | numfmt --to=iec
12M

オプション --from: 入力のパターンを指定
▷ --from=[ユニット]
入力のパターンを指定する。numfmt コマンドはデフォルトでは入力は 12345678 などと接頭辞なしを想定しているが、入力が 123K などと接頭辞ありの場合に --from を指定するとよい。--to オプションと同じく、ユニットには si・iec-i・iec を指定できる。
% echo 123M | numfmt --from=si
123000000
% echo 123Mi | numfmt --from=iec-i
128974848
% echo 123M | numfmt --from=iec
128974848

オプション --to-unit: 出力時の基数を指定
▷ --to-unit=[基数]
--to オプションは 12345678 を 12M などと変換する。ここで 12 という数字は問題ないが、M や Mi などの文字をつけたくない場合、--to-unit にて基数を変換する手もある。
% echo 12345678 |numfmt --to-unit=1000
12346
→ SI 単位系の K 換算
% echo 12345678 |numfmt --to-unit=1000000
13
→ SI 単位系の M 換算
% echo 12345678 |numfmt --to-unit=1024
12057
→ IEC の Ki 換算
% echo 12345678 |numfmt --to-unit=1048576
12
→ IEC の Mi 換算

オプション --suffix: 入出力の接尾辞を指定
▷ --suffix=[接尾辞]
出力時に B や Bytes などの文字列を付加したい場合、--suffix オプションを使う。
% echo 12345678 | numfmt --suffix=B --to=iec
12MB
% echo 12345678 | numfmt --suffix=Byte --to=iec
12MByte
また、--suffix オプションは、入力の文字列に指定の接尾辞がついていてもエラーとしないという効果もある。
% echo 12345678B | numfmt --suffix=B --to=iec
12MB

オプション --padding: 出力時に空白埋め
▷ --padding=[桁数]
出力において空白埋めをする場合に使用する。
% (echo 1234 abc;  echo 12345678 def) | numfmt --to=si
1.3K abc
13M def
→ デフォルトでは桁はそろわない
% (echo 1234 abc; echo 12345678 def) | numfmt --to=si --padding=7 1.3K abc 13M def
→ --padding=7 で 7桁右詰め
% (echo 1234 abc; echo 12345678 def) | numfmt --to=si --padding=-7 1.3K abc 13M def
→ --padding=-7 で 7桁左詰め

オプション --invalid: エラー時の挙動を設定
▷ --invalid=[エラーモード]
numfmt コマンドは、デフォルトでは数値でない文字列 (例えば abc など) があらわれるとエラーとして処理を打ち切ってしまう。--invalid を使うことでエラーを無視したり、警告扱いにすることができる。
▷ --invalid=abort … エラーとし、処理を打ち切る (デフォルト)
▷ --invalid=fail … 変換できない文字列をそのまま出力しつつ、標準エラー出力にエラーの旨出力し、終了ステータスコードを 2 とする。
▷ --invalid=warn … fail と似ているが、終了ステータスコードは 0 とする。
▷ --invalid=ignore … 変換できない文字列をそのまま出力し、エラー出力は行わない。
例は下記のとおり。
% (echo abc; echo 12345678) | numfmt --to=iec --invalid=abort
numfmt: invalid number: 'abc'
→ エラーとして処理を打ち切る
% (echo abc; echo 12345678) | numfmt --to=iec --invalid=fail
numfmt: invalid number: 'abc'
abc
12M
→ エラー表示はするが続行
% (echo abc; echo 12345678) | numfmt --to=iec --invalid=ignore
abc
12M
→ エラー表示なし
オプション --header: ヘッダ行をスキップ
▷ --header
先頭 1行目をヘッダ行として、変換を行わずそのまま表示する。
% (echo "This is header"; echo 12345678) | numfmt --to=iec
numfmt: invalid number: ‘This’

% (echo "This is header"; echo 12345678) | numfmt --to=iec --header
This is header
12M
--header=3 などと、スキップ対象の行数を指定することもできる。

オプション --field: 対象カラムを指定
▷ --field=[対象カラム]
数値変換対象のカラムを指定する。デフォルトは 1 なので、1カラム目のみを対象とする。対象カラムは下記のようにいろいろな指定が可能である。
▷ --fields=2 … 2番目のカラムのみを対象とする
▷ --fields=2-5 … 2番目から 5番目までのカラムを対象とする
▷ --fields=2- … 2番目から最後までのカラムを対象とする
▷ --fields=-5 … 1番目から 5番目までのカラムを対象とする
▷ --fields=2,5 … 2番目と 5番目のカラムを対象とする
▷ --fields=2-3,5- … 2・3番目と 5番目以降のカラムを対象とする
▷ --fields=- … 全てのカラムを対象とする

オプション --format: 出力時のフォーマットを指定
▷ --format=[フォーマット文字列]
--format オプションを使うことで、printf(3) のような指定が可能となる。--format オプションは --to オプションと一緒には使えない。

これがデフォルト:
% echo 12345.67 | numfmt --format="%f"
12345.67
小数点以下の桁数を 1 桁とする:
% echo 12345.67 | numfmt --format="%.1f"
12345.7
15桁で右詰めパディング:
% echo 12345.67 | numfmt --format="%15f"
       12345.67
15桁で左詰めパディング:
% echo 12345.67 HOGE | numfmt --format="%-15f"
12345.67       HOGE
シングルクォートを入れるとカンマ埋め:
% echo 1234567890 | numfmt --format="%'f"
1,234,567,890
10桁ゼロパディング:
% echo 12345.67 | numfmt --format="%010.3f"
012345.670
普通の文字列も設定可能:
% echo 1234567 | numfmt --format="hoge[%f]fuga
hoge[1234567]fuga

関連コマンド
numfmt コマンドと組み合わせて使うとしたら du コマンドくらいしか思いつかないのだが…。何かあったっけ。

パディングやカンマ埋めについては printf コマンドを使う手もある。