Linux printf コマンド
一、printf コマンド概要
printf は Linux/Unix システムにおける強力なフォーマット出力コマンドで、C 言語の printf() 関数に由来します。echo コマンドと比較して、printf はより正確な出力制御とフォーマット機能を提供します。
主な特徴
- 正確なフォーマット:出力の配置、幅、精度などを制御できます
- 自動改行なし:デフォルトでは出力末尾に改行文字を追加しません(echo とは異なります)
- 多言語サポート:Unicode 文字の出力をサポートします
- 変数の挿入:文字列内に変数の値を挿入できます
二、基本構文
printf format-string [arguments...]
パラメータ説明
- format-string:書式文字列。通常の文字と書式指定子を含みます
- arguments:書式指定子に対応するパラメータのリスト
三、書式指定子の詳細
書式指定子は%で始まり、基本形式は次のとおりです:
%[flags][width][.precision]specifier
よく使う書式指定子
| 指定子 | 説明 | 例 |
|---|---|---|
| %s | 文字列 | printf "%s" "hello" |
| %d | 10進整数 | printf "%d" 123 |
| %f | 浮動小数点数 | printf "%f" 3.14 |
| %x | 16進整数(小文字) | printf "%x" 255 |
| %X | 16進整数(大文字) | printf "%X" 255 |
| %o | 8進整数 | printf "%o" 8 |
| %c | 単一の文字 | printf "%c" 65 |
修飾子オプション
1. フラグ
| フラグ | 説明 | 例 |
|---|---|---|
| - | 左揃え | printf "%-10s" "hi" |
| + | 正負の符号を表示 | printf "%+d" 123 |
| 0 | ゼロで埋める | printf "%05d" 12 |
| 空白 | 正数の前に空白を残す | printf "% d" 123 |
| # | 特殊な形式(0xプレフィックスなど) | printf "%#x" 255 |
2. 幅
最小フィールド幅を指定し、不足する場合は埋めます
例
printf "%10s\n" "hello" # 右揃え、幅10
printf "%-10s\n" "hello" # 左揃え、幅10
printf "%-10s\n" "hello" # 左揃え、幅10
3. 精度(.precision)
浮動小数点数の場合、小数点以下の桁数を指定します。文字列の場合、最大文字数を指定します。
例
printf "%.2f\n" 3.14159 # 3.14 を出力
printf "%.5s\n" "abcdefg" # abcde を出力
printf "%.5s\n" "abcdefg" # abcde を出力
四、実用的な例
例1:基本的なフォーマット出力
例
printf "Name: %s, Age: %d, Height: %.2f\n" "Alice" 25 1.68
出力:
Name: Alice, Age: 25, Height: 1.68
例2:テーブルの整列出力
例
printf "%-10s %-10s %-10s\n" "Name" "Age" "Score"
printf "%-10s %-10d %-10.2f\n" "Alice" 25 89.5
printf "%-10s %-10d %-10.2f\n" "Bob" 23 92.3
printf "%-10s %-10d %-10.2f\n" "Alice" 25 89.5
printf "%-10s %-10d %-10.2f\n" "Bob" 23 92.3
出力:
Name Age Score Alice 25 89.50 Bob 23 92.30
例3:特殊文字の処理
例
printf "Temperature: %d°C\n" 25
printf "Path: %s\n" "/home/user"
printf "Alert: \a\n" # ベル文字
printf "Path: %s\n" "/home/user"
printf "Alert: \a\n" # ベル文字
例4:変数の挿入
例
name="John"
age=30
printf "User: %s, %d years old\n" "$name" "$age"
age=30
printf "User: %s, %d years old\n" "$name" "$age"
五、高度な使い方
1. 日付のフォーマット出力
例
printf "Today is %(%Y-%m-%d)T\n" -1
2. 色の出力
例
printf "\e[31mRed Text\e[0m\n"
printf "\e[32mGreen Text\e[0m\n"
printf "\e[32mGreen Text\e[0m\n"
3. 動的に幅を指定
例
width=20
printf "%*s\n" $width "Right aligned"
printf "%*s\n" $width "Right aligned"
六、よくある問題と注意点
改行の問題:printf はデフォルトで改行文字を追加しないため、手動で追加する必要があります\n
例
printf "No newline"
printf "Add newline\n"
printf "Add newline\n"
パラメータ数の不一致:パラメータが書式指定子より少ない場合、未定義の値が出力されます
例
printf "%s %s\n" "only_one" # 2番目の%sは空を出力します
引用符の処理:書式文字列はダブルクォートで囲み、変数もダブルクォートで囲むことをお勧めします
例
printf "%s\n" "$variable"
特殊文字のエスケープ:書式文字列内でバックスラッシュを使用して特殊文字をエスケープする必要があります
七、printf vs echo
| 特性 | printf | echo |
|---|---|---|
| 改行 | \n を明示的に追加する必要あり | 自動で追加 |
| フォーマット | 複雑なフォーマットをサポート | 簡単な出力 |
| 一貫性 | 各システムで動作が一貫 | システムによって差異がある可能性 |
| 変数展開 | 明示的に指定する必要あり | 自動で展開 |
| 特殊文字 | エスケープが必要 | 一部のバージョンは -e オプションをサポート |