Linux teeコマンド完全ガイド|標準出力を保存・追記・sudo権限・ログ取得の実践例まで

  • URLをコピーしました!

tee コマンドは、標準入力から受け取った内容を画面に表示しつつ、同時にファイルへ保存できる便利なコマンドです。 ログ取得・デバッグ・手順の証跡作りで非常に頻出で、特に「パイプ処理の途中結果を残したい」ときに強力です。

📌 他のLinuxコマンドもまとめて確認したい方へ
ファイル操作・検索・テキスト処理など用途別に整理した総合まとめはこちら。
Linuxコマンド総まとめ

目次

目次

基本構文

tee [オプション] [ファイル...]
  • 標準入力:パイプ(|)などで受け取る
  • 標準出力:画面へ出力(通常のパイプ先にも流せる)
  • ファイル:指定したファイルへ保存(複数指定可)

主なオプション

オプション意味実務用途
-a追記(append)ログを上書きせず追記する
-iSIGINT(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

目次