printfコマンドでシェルスクリプトの出力を整形する方法|echoとの違いや書式指定・色付き出力も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, テキスト処理コマンド > printfコマンドでシェルスクリプトの出力を整形する方法|echoとの違いや書式指定・色付き出力も
「echoで出力していたら文字化けした」「ログに日時を付けたいけどフォーマットが揃わない」「シェルスクリプトのデバッグ出力を色分けしたい」
こんな悩みを持ったことはありませんか?

Linux の printf コマンドは、C言語の printf 関数と同じ書式指定でテキストを出力できるコマンドです。echo では難しい「フォーマット制御」「数値のゼロ埋め」「エスケープシーケンス」などを正確に扱えます。

この記事では、printf コマンドの基本構文から始まり、書式指定子・エスケープシーケンス・実務でよく使うパターン・echo との使い分け・トラブルシュートまでを実行例付きで解説します。

この記事のポイント

・printf "%s\n" で echo より確実に文字列を出力できる
・%d・%05d・%f で数値のゼロ埋め・小数点桁数を制御できる
・\e[32m 等のANSIコードで端末出力を色付けできる
・echo と printf の使い分けは「書式が必要かどうか」で判断する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

printf コマンドとは?echo との違いを理解する

Linux には出力系コマンドが複数ありますが、printf と echo の違いを正確に把握しておくことは、シェルスクリプトの品質を上げるうえで重要です。

echo の特徴:
・引数をそのまま改行付きで出力する
・シェルによって -e オプションの挙動が異なる(可搬性が低い)
・書式指定の機能を持たない

printf の特徴:
・C言語の printf と同じ書式指定が使える
・POSIX で規格化されており、bash・sh・dash 全てで同じ動作
・末尾に自動で改行が付かない(\n を明示的に指定する)

実務での使い分けは、「単純な1行出力は echo、フォーマットを制御したいときは printf」が基本です。スクリプトの可搬性を重視するなら、常に printf を使う方針にしておくと安全です。

実行環境を確認しておきましょう。本記事のコマンドは以下の環境で動作確認済みです。

# 動作確認環境 # RHEL 9.4 / Rocky Linux 9.4 / Ubuntu 24.04 LTS $ bash --version GNU bash, version 5.2.26(1)-release (x86_64-redhat-linux-gnu) $ printf --version printf (GNU coreutils) 8.32

基本的な使い方

1. 基本構文と最初のコマンド実行

printf の基本構文は次のとおりです。

printf 書式文字列 [引数...]

最初に試す簡単な例から始めましょう。

# 文字列を出力する(\n で改行) $ printf "Hello, Linux!\n" Hello, Linux! # 複数の引数を渡す $ printf "User: %s\n" tomohiro User: tomohiro # 変数と組み合わせる $ name="server01" $ printf "Hostname: %s\n" "$name" Hostname: server01

echo と比較してみます。

# echo は末尾に自動で改行が付く $ echo "Hello" Hello # printf は \n がないと改行されない $ printf "Hello" Hello$ # \n を付けると echo と同じ挙動 $ printf "Hello\n" Hello

2. 書式指定子の使い方

printf の書式指定子は「%」から始まります。よく使うものを実行例と一緒に確認しましょう。

# %s:文字列 $ printf "%s\n" "Linux" Linux # %d:整数(10進数) $ printf "%d\n" 42 42 # %f:浮動小数点数 $ printf "%f\n" 3.14 3.140000 # %05d:5桁ゼロ埋め(ログ連番に便利) $ printf "%05d\n" 7 00007 # %.2f:小数点以下2桁 $ printf "%.2f\n" 3.14159 3.14 # %10s:右寄せ10文字幅 $ printf "%10s\n" "Linux" Linux # %-10s:左寄せ10文字幅 $ printf "%-10s|\n" "Linux" Linux |

3. エスケープシーケンスの活用

printf ではバックスラッシュエスケープが使えます。シェルスクリプトでのログ出力などに役立ちます。

# \n:改行 $ printf "line1\nline2\n" line1 line2 # \t:タブ $ printf "col1\tcol2\tcol3\n" col1 col2 col3 # \r:キャリッジリターン(プログレスバー等に使う) $ printf "処理中...\r" # \\:バックスラッシュ自体 $ printf "path: /usr\\local\\bin\n" path: /usr\local\bin

応用・実務Tips

4. ゼロ埋め連番でログファイルを整形する

サーバー運用でログファイル名に連番を付けたいときや、バックアップの管理番号を揃えたいとき、printf の書式指定が非常に役立ちます。

# ループでゼロ埋めファイル名を生成 for i in 1 2 3 10 100; do printf "backup_%05d.tar.gz\n" "$i" done # 出力: # backup_00001.tar.gz # backup_00002.tar.gz # backup_00003.tar.gz # backup_00010.tar.gz # backup_00100.tar.gz

実際の現場では、バックアップスクリプトやログローテーションスクリプトでこのパターンを使う機会が多いです。

5. 日時をフォーマット付きで出力する

スクリプトのログに timestamp を付けるときも printf は便利です。date コマンドと組み合わせて使います。

# 現在日時をフォーマット付きで出力 $ printf "[%s] 処理を開始します\n" "$(date '+%Y-%m-%d %H:%M:%S')" [2026-05-08 10:30:00] 処理を開始します # ログファイルに書き込む場合 $ printf "[%s] ERROR: %s\n" "$(date '+%Y-%m-%d %H:%M:%S')" "接続タイムアウト" >> /var/log/myapp.log

6. ANSIカラーコードで出力を色付けする

端末への出力を色付けすると、スクリプトの可読性が大幅に向上します。エラーは赤、成功は緑、情報は青、というように色分けすると一目でわかります。

# ANSIカラーコード定義 RED='\e[31m' GREEN='\e[32m' YELLOW='\e[33m' BLUE='\e[34m' RESET='\e[0m' # 色付き出力 printf "${GREEN}[OK]${RESET} サービスが起動しました\n" printf "${RED}[ERROR]${RESET} 設定ファイルが見つかりません\n" printf "${YELLOW}[WARN]${RESET} ディスク使用率が80%%を超えています\n" printf "${BLUE}[INFO]${RESET} バックアップを開始します\n"

「%%」は printf では「%」のエスケープ表現です。1つの「%」だけだと書式指定子として解釈されてしまうため、「%%」と2つ重ねて書きます。

実際の Linux サーバー上での出力は次のようになります(色は端末エミュレータによって異なります)。

7. 複数列を揃えて表示する(レポート出力)

システム情報を一覧表示したいときにも printf の幅指定が役立ちます。

# サービス状態のレポートをきれいに表示するスクリプト #!/bin/bash printf "%-15s %-10s %s\n" "SERVICE" "STATUS" "PID" printf "%-15s %-10s %s\n" "---------------" "----------" "-----" printf "%-15s %-10s %s\n" "nginx" "running" "1234" printf "%-15s %-10s %s\n" "mysql" "running" "2345" printf "%-15s %-10s %s\n" "postfix" "stopped" "-" # 出力: # SERVICE STATUS PID # --------------- ---------- ----- # nginx running 1234 # mysql running 2345 # postfix stopped -

Linux 基本コマンドの解説にある他のコマンドと組み合わせると、より高度なレポートスクリプトを作れます。

8. printf をファイルに出力する

printf は標準出力に書き込みますが、リダイレクトを使ってファイルに書くこともできます。設定ファイルの生成や CSV 出力に使えます。

# CSVファイルを生成する printf "hostname,ip,status\n" > /tmp/servers.csv printf "web01,192.168.1.10,running\n" >> /tmp/servers.csv printf "db01,192.168.1.20,running\n" >> /tmp/servers.csv # 確認 $ cat /tmp/servers.csv hostname,ip,status web01,192.168.1.10,running db01,192.168.1.20,running

ls コマンドの基本オプションと組み合わせることで、ファイル一覧を整形してレポートに出力するスクリプトも作れます。

トラブルシュート・エラー対処

「printf: missing format character」が出た時の対処法

# NG例:%の後に書式指定子がない $ printf "discount: 50%\n" bash: printf: `\n': missing format character # OK例:%を2つ重ねてエスケープする $ printf "discount: 50%%\n" discount: 50%

「%」をそのまま出力したい場合は「%%」と書く必要があります。これは printf の仕様で、「%」は常に書式指定子の開始文字として解釈されるためです。

「\n が改行にならない」時の対処法

# NG例:シングルクォートでは \n がリテラルになる $ printf '\n' (何も出力されない or 改行のみ) # NG例(環境によっては):echo -e の挙動はシェルによって異なる $ echo -e "test\ntest" test test # bashでは動くがshでは動かない環境もある # OK例:printf はシングルクォートでも \n を改行に解釈する(POSIX動作) $ printf "line1\nline2\n" line1 line2

変数に「-」で始まる値が入っていてオプションと誤認される

# NG例:変数に "-e" が入るとオプションとして解釈される $ val="-e" $ echo $val # -e がオプションとして解釈される(環境によって挙動が変わる) # OK例:printf は書式文字列で制御するため変数がオプション化しない $ val="-e" $ printf "%s\n" "$val" -e

これは printf が echo より安全な理由の1つです。特に外部入力を扱うスクリプトでは printf を使いましょう。

色付き出力が文字化けする(ファイルに書き込んだとき)

# NG例:ANSIエスケープコードがログファイルに混入する $ printf "\e[32m[OK]\e[0m 完了\n" >> /var/log/myapp.log $ cat /var/log/myapp.log ESC[32m[OK]ESC[0m 完了 # ESC文字が残ってしまう # OK例:端末への出力か判定してから色付けする if [ -t 1 ]; then # 標準出力が端末ならカラー有効 GREEN='\e[32m'; RESET='\e[0m' else # ファイルリダイレクトや非端末ならカラー無効 GREEN=''; RESET='' fi printf "${GREEN}[OK]${RESET} 完了\n"

[ -t 1 ] は「ファイルディスクリプタ1(標準出力)が端末に接続されているか」を判定する条件式です。実務のスクリプトではこのガードを必ず入れましょう。

本記事のまとめ

printf コマンドの使い方を整理します。

やりたいこと コマンド
文字列を改行付きで出力 printf "%s\n" "文字列"
整数を5桁ゼロ埋めで出力 printf "%05d\n" 数値
浮動小数点数を小数点2桁で出力 printf "%.2f\n" 数値
10文字幅で右寄せ出力 printf "%10s\n" "文字列"
10文字幅で左寄せ出力 printf "%-10s\n" "文字列"
%記号をそのまま出力 printf "50%%\n"
タブ区切りで複数列出力 printf "%s\t%s\n" "col1" "col2"
緑色テキストで出力 printf "\e[32m%s\e[0m\n" "テキスト"
ファイルに追記する printf "%s\n" "内容" >> ファイル名

printf は一見シンプルなコマンドですが、シェルスクリプトの品質を大きく左右します。echo の代わりに printf を使う習慣を身につけるだけで、可搬性・安全性・可読性が一気に向上します。

dig コマンドで DNS を調べる」など他のコマンドと組み合わせたスクリプト作成にも、本記事の書式指定の知識は役立ちます。シェルスクリプト全般の学習については「csh 環境変数設定の解説」も参考にしてください。

printfコマンドを使いこなせたら、次はサーバー構築の基礎を固めませんか?

書式を制御した出力でスクリプトの品質を高める力がつけば、サーバー管理の効率は大きく変わります。その力を活かして、体系的にLinuxサーバー構築を学んでみませんか。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。