こんな悩みを持ったことはありませんか?
Linux の printf コマンドは、C言語の printf 関数と同じ書式指定でテキストを出力できるコマンドです。echo では難しい「フォーマット制御」「数値のゼロ埋め」「エスケープシーケンス」などを正確に扱えます。
この記事では、printf コマンドの基本構文から始まり、書式指定子・エスケープシーケンス・実務でよく使うパターン・echo との使い分け・トラブルシュートまでを実行例付きで解説します。
この記事のポイント
・printf "%s\n" で echo より確実に文字列を出力できる
・%d・%05d・%f で数値のゼロ埋め・小数点桁数を制御できる
・\e[32m 等のANSIコードで端末出力を色付けできる
・echo と printf の使い分けは「書式が必要かどうか」で判断する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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 "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"
実際の 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 -
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
トラブルシュート・エラー対処
「printf: missing format character」が出た時の対処法
# NG例:%の後に書式指定子がない $ printf "discount: 50%\n" bash: printf: `\n': missing format character # OK例:%を2つ重ねてエスケープする $ printf "discount: 50%%\n" discount: 50%
「\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
色付き出力が文字化けする(ファイルに書き込んだとき)
# 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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:gpgコマンドでファイルを暗号化・復号する方法|鍵管理から実務活用まで
- 前のページへ:columnコマンドでテキストを表形式に整形する方法|TSVやログをきれいに揃える実践例も
- この記事の属するカテゴリ:Linuxtips・テキスト処理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます