本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、入力データを整形して表示する「printf」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、入力データを整形して表示する「printf」コマンドです。
「printf」は入力データを整形して表示するコマンドです。
printfという名前のコマンドは複数あり、一つはbashの内部コマンド(ビルトインコマンド、シェルコマンド)、もう一つは外部コマンド(/usr/bin/printf)です。パスなどを指定しないで実行した場合は、ビルトインコマンドのprintfを実行します(連載第153回)。
printf [-v 変数名] 書式 [数や文字列などの値]
※[ ]は省略可能な引数を示しています。
短いオプション | 意味 |
---|---|
-v 変数名 | 整形した内容をシェル変数にセットする(内部コマンドのみ) |
記号 | 意味 |
---|---|
%dまたは%i | 10進数の整数(符号付き) |
%u | 10進数の整数(符号なし) |
%o | 8進数の整数(符号付き) |
%x | 16進数の整数(符号付き、アルファベット部分は小文字) |
%X | 16進数の整数(符号付き、アルファベット部分は大文字) |
%fまたは%F | 小数形式の浮動小数点数(%に続けて「整数部の桁数.小数部の桁数」を指定可能、指定しなかった場合は小数点以下5桁で表示) |
%e | 指数形式の浮動小数点数(指数記号"e"部分が小文字) |
%E | 指数形式の浮動小数点数(指数記号"E"部分が大文字) |
%g | %eまたは%f(適した方の書式を自動選択する) |
%G | %Eまたは%F(適した方の書式を自動選択する) |
%c | 1文字 |
%s | 文字列 |
記号 | 意味 |
---|---|
\" | 単一の「"(ダブルクォーテーション)」文字 |
\\ | バックスラッシュ |
\a | 警告(ベル音) |
\b | バックスペース |
\e | エスケープ |
\f | フォームフィード |
\n | 改行 |
\r | キャリッジリターン |
\t | 水平タブ |
\v | 垂直タブ |
\NNN | 8進数で表現した1バイト文字(NNN部分は1〜3文字の数字) |
\xHH | 16進数で表現した1バイト文字(HH部分は1〜2文字の16進数) |
\uHHHH | 16進数4文字で表現したUnicode(ISO/IEC 10646)スカラー値 |
\UHHHHHHHH | 16進数8文字で表現したUnicodeスカラー値 |
%% | 単一の「%」文字 |
「printf 書式 値」で、指定した値を書式に従って出力します。例えば「123456」という数値を16進数で表示するならば「printf "%X" 1234656」、3桁区切りの整数で表示するならば「printf "%'d" 123456」のように書きます(画面1)。
数値の場合、「%」の後に表示する桁数を指定できます。例えば「%3d」の場合は指定した数値を3桁の幅で表示します。数値が3桁より小さい場合は空白で幅を自動調節します。逆に、3桁より大きい場合は3桁よりはみ出して表示します。
桁数を指定した場合、数字は右寄せになります。左寄せにしたい場合は「%-3d」のように、マイナスを付けて指定します。
先頭を0で埋めた状態(0でパディング)にしたい場合は「%03d」のように、「0」と桁数を指定します。
なお、書式指定の引用符は必須ではありません。「printf %X 1234656」あるいは「printf %\'d 123456」のように表記しても動作します。ただし、多くの場合は書式の最後に改行を表す「\n」を付けたり、後ほど紹介するように書式の中に空白を入れたりすることが多いため、書式全体を「"〜"」で囲む方が分かりやすく、指定もしやすいでしょう。
printfは出力を自動改行しません。コマンド実行例のように必要に応じ「\n」を指定してください。
printf "書式" 値
(値を書式に従って表示する)
printf "%X\n" 1234656
(16進数で123456を表示後、改行する)(画面1)
printf "%'d\n" 123456
(3桁区切りで123456を表示後、改行する)(画面1)
printf "%3d\n" 10
(3桁で10を表示後、改行する)(画面1)
printf "%-3d\n" 10
(3桁で左寄せにして10を表示後、改行する)(画面1)
printf "%03d\n" 10
(先頭を0で埋めた3桁で10を表示後、改行する)(画面1)
printfでは複数の値を組み合わせて表示することもできます。この場合、「printf "書式1 書式2 書式3" 値1 値2 値3」のように指定します(画面2)。
書式の部分には書式の指定に使用する記号以外にも、自由な文字列を指定できます。
printf "書式1 書式2 書式3" 値1 値2 値3
(値1を書式1で、値2を書式2で、値3を書式3で表示する)
printf "%d %x \n" 255 255
(10進数と16進数の形式で255を表示後、改行する)(画面2)
printf "%04d %04x \n" 255 255
(0でパディングを施した4桁の10進数と、同じく4桁の16進数で255を表示して改行する)(画面2)
printf "%04d = 0x%04x \n" 255 255
(0でパティングした4桁の10進数で255を表示、「 = 0x」という文字列を表示、同じく4桁の16進数で255を表示、その後改行する)(画面2)
なお、指定した書式の数と値の数が異なる場合、printfコマンドは次のように処理します(画面3)。
あるコマンドの実行結果をprintfで整形したい場合、コマンドの結果が引数になるように指定します。例えば「printf 書式 `コマンド名`」あるいは「printf 書式 $(コマンド名)」のように指定します。
従って、「printf 書式 `cat テキストファイル`」のように指定すると、テキストファイルをprintfで整形できます。
コマンドを先に書いてパイプ(|)でprintfにつなぎたい場合は、「コマンド名 | printf 書式 `cat`」のように、printfの引数でcatを実行します。
なお、書式設定に条件を加えたり、表示の順番を入れ替えたりするなど、もっと複雑な指定をしたい場合は、awkやperlなどのスクリプト言語を使用するとよいでしょう。多くの言語でprintfコマンドと同じような書式設定が使用可能です。
printf 書式 `コマンド`
(コマンドの実行結果をprintfで整形して表示する)
`コマンド` | printf 書式 `cat`
(コマンドの実行結果をprintfで整形して表示する)
画面4では、文字列と数字のペアを含むdata.txtをprintfで整形しています。「sort -k2n」では、「sort」コマンド(第63回)で、「2つ目のフィールドを数値として並べ替える」という操作をしています。
画面4の最後のコマンドラインでパイプを使わないように書き直すと、画面5のようになります。
なお、printfは1行単位で入力データを処理しているのではありません。以下の画面6からも分かる通り、printfは、空白文字(スペースやタブ、空行)で区切られた値に対して、順番に書式に当てはめて表示しています。このため入力データの種類が書式と合致しないとき、予想外の位置にエラーメッセージが表示されることがあります。
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.