printfコマンドは、フォーマット指定子を含むようなフォーマット文字列を利用して、文字列を表示するコマンドです。
printfコマンドは、第一引数として、フォーマット文字列を、第二引数以降はフォーマット指定子に代入する値になります。C言語のprintf関数のようにフォーマット文字列を利用できます。
また、文字列を表示するコマンドとしてechoコマンドがあります。echoコマンドの場合、自動で最後に改行が追加されますが、printfコマンドは自動で改行が追加されません。
目次
printfコマンドの構文
printfコマンドの構文
printf format [argument]...
printfコマンドの利用例
文字列の表示
printfコマンドは、C言語のprintf関数のように利用できます。例えば、0埋めの3桁の数字を表示させたい場合は、'%03d'のようにフォーマット指定子を用いると、値を0埋めの3桁で表示することが出来ます。
コマンド例
1 |
printf 'value: %03d\n' 3 |
実行結果
1 |
value: 003 |
フォーマット文字列を再利用
C言語のprintf関数と異なり、printfコマンドには面白い特徴があります。
printfコマンドは引数の数がフォーマット指定子の数より多い場合、フォーマット文字列を再利用します。
コマンド例
1 |
printf 'value: %03d\n' 3 4 5 |
実行結果
1 2 3 |
value: 003 value: 004 value: 005 |
xargsコマンドと組み合わせる
printfコマンドで多くの文字列を加工したい場合、xargsコマンドと組み合わせると文字列の加工が便利です。
コマンド例
1 |
seq 9 | xargs -n2 printf '%04d:% 3d\n' |
実行結果
1 2 3 4 5 |
0001: 2 0003: 4 0005: 6 0007: 8 0009: 0 |
printfコマンドで利用できるフォーマット指定子
printfコマンドでは以下のフォーマット指定子が利用できます。
フォーマット指定子の種類
指定子 | 変換 |
%d | 符号付き整数 |
%i | 符号付き整数 |
%o | 符号なし8進数 |
%u | 符号なし整数 |
%x | 符号なし16進数(小文字) |
%X | 符号なし16進数(大文字) |
%f | 通常表記の浮動小数点数 |
%e | 指数表記の浮動小数点数(小文字) |
%E | 指数表記の浮動小数点数(大文字) |
%g | 数値の大きさに応じた浮動小数点数(大文字) |
%G | 数値の大きさに応じた浮動小数点数(小文字) |
%a | 16進数(小文字)の指数表記の浮動小数点、指数は10進数 |
%A | 16進数(大文字)の指数表記の浮動小数点、指数は10進数 |
%c | 単一文字の出力 |
%s | 文字列の出力 |
%n | 今までの印刷された文字数を変数にセット |
%% | %を出力 |
%b | 文字列のあるエスケープ文字を解釈して、出力 |
%q | 文字列をそのままシェルで利用できるように文字をエスケープ |
それぞれのフォーマット指定子の利用例は以下のようになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
$ printf '%d\n' 12 -12 12 -12 $ printf '%i\n' 12 -12 12 -12 $ printf '%o\n' 12 -12 14 1777777777777777777764 $ printf '%u\n' 12 -12 12 18446744073709551604 $ printf '%x\n' 12 -12 c fffffffffffffff4 $ printf '%X\n' 12 -12 C FFFFFFFFFFFFFFF4 $ printf '%f\n' 12.345 -12.345 12.345000 -12.345000 $ printf '%e\n' 12.345 -12.345 1.234500e+01 -1.234500e+01 $ printf '%E\n' 12.345 -12.345 1.234500E+01 -1.234500E+01 $ printf '%g\n' 12.345 -12.345 123456789123 12.345 -12.345 1.23457e+11 $ printf '%G\n' 12.345 -12.345 123456789123 12.345 -12.345 1.23457E+11 $ printf '%a\n' 12.25 -12.25 0xc.4p+0 -0xc.4p+0 $ printf '%A\n' 12.25 -12.25 0XC.4P+0 -0XC.4P+0 $ printf '%c\n' abcdef a $ printf '%s\n' abcdef abcdef $ printf '%s world%n \n' hello var1 hello world $ echo var1=11 var1=11 $ printf '%%\n' % $ printf '%b\n' 'test1\ntest2' test1 test2 $ printf '%q\n' '!"#$%&abcdef' \!\"#\$%\&abcdef $ printf '%q\n' あいう あいう $ LANG=C printf '%q\n' あいう $'\343\201\202\343\201\204\343\201\206' |
フォーマット指定子の変換仕様の構文(参考)
GNU C Libraryより、C言語のフォーマット指定子の変換仕様の構文は以下のようになります。
% [ param-no $] flags width [ . precision ] type conversion
printfコマンドではparam-noは指定できないので、printfコマンドを利用する場合は
% flags width [ . precision ] type conversion
の構文で利用できます。
param-noは、POSIX拡張で、printf関数でのフォーマット文字列の後の引数をパラメータ番号で指定できます。C言語で利用する場合は、全てのフォーマット指定子に対して、param-noを付けます。
flagsは、数字の表示方法などを0埋めや左寄せのように変更できます。
widthはフィールドの幅で、precisionは精度になります。
typeは、long int等の型にかかわるパラメータで%ldのlに当たる部分になります。
conversionは、上の例の%dや%fのdやfの記号に当たる部分になります。
flagについて
flagについては例えば、以下のようなフラグがあります。
flagの種類
フラグ | 表示方法 |
’-’ | 左寄せ |
’+’ | 符号を表示(正の場合、+) |
’ ’ | %dや%iで符号が指定されていない場合、 接頭辞としてスペースを空ける |
’'’ | 桁区切り(GNU拡張) |
’0’ | スペースの代わりに0で埋める |
上の表のflagをprintfコマンドで利用すると以下のようになります。
コマンド例と実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$ printf '%5d\n' 3 +3 -3 3 3 -3 $ printf '%-5d\n' 3 +3 -3 3 3 -3 $ printf '%d\n' 3 +3 -3 3 3 -3 $ printf '%+d\n' 3 +3 -3 +3 +3 -3 $ printf '% d\n' 3 +3 -3 3 3 -3 $ printf "%'5d\n" 300000 +300000 -300000 300,000 300,000 -300,000 $ printf '%05d\n' 3 +3 -3 00003 00003 -0003 $ printf '%0+5d\n' 3 +3 -3 +0003 +0003 -0003 |