【 printf 】コマンド――データを整形して表示するLinux基本コマンドTips(319)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、入力データを整形して表示する「printf」コマンドです。

» 2019年07月05日 05時00分 公開
[西村めぐみ@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、入力データを整形して表示する「printf」コマンドです。

printfコマンドとは?

 「printf」は入力データを整形して表示するコマンドです。

 printfという名前のコマンドは複数あり、一つはbashの内部コマンド(ビルトインコマンド、シェルコマンド)、もう一つは外部コマンド(/usr/bin/printf)です。パスなどを指定しないで実行した場合は、ビルトインコマンドのprintfを実行します(連載第153回)。



printfコマンドの書式

printf [-v 変数名] 書式 [数や文字列などの値]

※[ ]は省略可能な引数を示しています。





printfの主なオプション

短いオプション 意味
-v 変数名 整形した内容をシェル変数にセットする(内部コマンドのみ)

書式の指定に使用する記号(※1)

記号 意味
%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 文字列

※1 %の後に桁数を指定することも可能(例えば3桁の整数ならば%3dなど、本文を参照)。数値の場合、%の後ろに「'」記号を付けると3桁区切りで出力できる(本文を参照



特殊文字などを表す記号

記号 意味
\" 単一の「"(ダブルクォーテーション)」文字
\\ バックスラッシュ
\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


画面1 画面1 さまざまな書式を指定して数値を出力したところ 「1234656」を16進数で表現すると「12D6E0」になる


複数の値や自由な文字列と組み合わせて表示する

 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


画面2 画面2 複数の値を異なる書式で表示したところ

 なお、指定した書式の数と値の数が異なる場合、printfコマンドは次のように処理します(画面3)。

  1. 「値」の方が多い場合は、printfを繰り返す
  2. 「値」が足りない場合は、0(数値用の書式の場合)または空白(文字列用の書式場合)を表示する
画面3 画面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 画面4 表データを書式に従って表示したところ

 画面4の最後のコマンドラインでパイプを使わないように書き直すと、画面5のようになります。

画面5 画面5 画面4にある最後のコマンドラインでパイプを使わないように書き直したもの

 なお、printfは1行単位で入力データを処理しているのではありません。以下の画面6からも分かる通り、printfは、空白文字(スペースやタブ、空行)で区切られた値に対して、順番に書式に当てはめて表示しています。このため入力データの種類が書式と合致しないとき、予想外の位置にエラーメッセージが表示されることがあります。

画面6 画面6 printfコマンドが入力データを処理する様子を調べたところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。


Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

AI for エンジニアリング
「サプライチェーン攻撃」対策
1P情シスのための脆弱性管理/対策の現実解
OSSのサプライチェーン管理、取るべきアクションとは
Microsoft & Windows最前線2024
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。