tee コマンドは、標準入力から受け取った内容を画面に表示しつつ、同時にファイルへ保存できる便利なコマンドです。 ログ取得・デバッグ・手順の証跡作りで非常に頻出で、特に「パイプ処理の途中結果を残したい」ときに強力です。
📌 他のLinuxコマンドもまとめて確認したい方へ
ファイル操作・検索・テキスト処理など用途別に整理した総合まとめはこちら。
▶ Linuxコマンド総まとめ
目次
- 基本構文
- 主なオプション
- 基本例(保存・追記・複数出力)
- 最重要:sudo とリダイレクトの罠(権限問題)
- 実務で使うログ取得テンプレ(コピペOK)
- よく使う組み合わせ(grep/awk/tail)
- よくあるエラーと対処
- FAQ
- 関連リンク(回遊導線)
基本構文
tee [オプション] [ファイル...]
- 標準入力:パイプ(
|)などで受け取る - 標準出力:画面へ出力(通常のパイプ先にも流せる)
- ファイル:指定したファイルへ保存(複数指定可)
主なオプション
| オプション | 意味 | 実務用途 |
|---|---|---|
-a | 追記(append) | ログを上書きせず追記する |
-i | SIGINT(Ctrl+C)を無視 | 中断させたくない処理のログ取得 |
--help | ヘルプ表示 | オプション確認 |
基本例(保存・追記・複数出力)
1) 画面に表示しつつファイルへ保存
echo "Hello, World!" | tee output.txt
画面に表示され、同時に output.txt にも保存されます。
2) 追記する(上書きしない)
echo "New Line" | tee -a output.txt
-a を付けると既存ファイルの末尾に追記されます。
3) 複数ファイルへ同時に保存
echo "Multiple outputs" | tee file1.txt file2.txt
4) パイプ処理を継続しながら途中結果を保存
cat access.log | tee raw.log | grep "ERROR" > error_only.log
「全ログ(raw.log)を残しつつ、ERRORだけ抽出」などに使えます。
最重要:sudo とリダイレクトの罠(権限問題)
「root権限が必要なファイルに書き込みたい」ケースで、以下は失敗しがちです。
NG例:sudo を付けても > の書き込みは root にならない
sudo echo "test" > /etc/example.conf
これは echo は root で動いても、>(リダイレクト)はsudoの外側=一般ユーザーの権限で実行されるため、Permission denied になりやすいです。
OK例:sudo tee を使う(定番)
echo "test" | sudo tee /etc/example.conf
追記したい場合(これも超頻出)
echo "add line" | sudo tee -a /etc/example.conf
この「sudo + tee」は、設定ファイル編集・運用手順で検索されやすく、上位記事にはほぼ必ず入っています。
実務で使うログ取得テンプレ
1) コマンド結果を保存しながら確認
df -h | tee df_$(date +%F).log
2) 疎通確認ログを取りながら表示
ping -c 10 example.com | tee ping.log
3) 長いコマンドの標準出力+標準エラーを両方記録(重要)
some_command 2>&1 | tee command_all.log
4) タイムスタンプ付きでログ採取(障害調査向け)
some_command 2>&1 | while IFS= read -r line; do
printf '%s %s\n' "$(date '+%F %T')" "$line"
done | tee command_ts.log
よく使う組み合わせ(grep/awk/tail)
grep:特定キーワードだけ見つつ全体ログも残す
tail -f /var/log/syslog | tee syslog_all.log | grep -E "error|fail|denied"
awk:必要フィールドだけ抽出して保存
cat access.log | tee raw_access.log | awk '{print $1, $7, $9}' > access_pick.log
複数段パイプの「途中」を保存(デバッグ定番)
cat app.log | tee step1.log | grep "WARN" | tee step2_warn.log | wc -l
よくあるエラーと対処
Permission denied になる
- 原因:書き込み先に権限がない(/etc, /var/log など)
- 対処:
sudo teeを使う(推奨)
echo "line" | sudo tee -a /etc/example.conf
tee でファイルが上書きされてしまった
- 原因:
-aなしで実行した - 対処:追記は必ず
tee -a
日本語や特殊文字が崩れる
- 原因:ロケールや文字コードの不一致(環境差)
- 対処:
LANGや端末設定を確認、必要なら UTF-8 に統一
FAQ
Q1. tee と >(リダイレクト)の違いは?> は「ファイルへ書くだけ」ですが、tee は「画面にも出しつつ、ファイルにも書く(複製する)」点が違います。
Q2. sudo echo “…” > /etc/xxx が失敗するのはなぜ?> はシェル側の処理で、sudo の外で実行されるためです。echo "..." | sudo tee /etc/xxx が定番解です。
Q3. 追記したい(上書きしたくない)tee -a を使います:echo "line" | tee -a file
Q4. 標準エラーも含めてログに残したい2>&1 で標準エラーを標準出力に合流してから tee します:cmd 2>&1 | tee all.log



