🎯 この記事で学べること
- 1`tee`コマンドの基本的な使い方を理解できます
- 2標準出力とファイル出力を同時に行う方法がわかります
- 3追記モード(-a)の使い方をマスターできます
- 4パイプラインでの効果的な活用方法が身につきます
- 5ログ記録やデバッグでの実践的な使い方を習得できます
読了時間: 約8分
teeコマンドとは
みなさん、コマンドの実行結果を画面で確認しながら、同時にファイルにも保存したいと思ったことはありませんか?そんな時に便利なのがtee
コマンドです!
tee
コマンドは、標準入力から読み取ったデータを標準出力とファイルの両方に同時に出力するツールです。T字型の配管(tee)のように、データの流れを2つに分岐させることからこの名前が付けられました。ログの記録やデバッグ作業で大活躍するコマンドなんですよ!
基本的な使い方
標準的な使用方法
まずは基本的な使い方から見ていきましょう。とってもシンプルです!
# 基本構文
$ command | tee filename
# echoの出力を画面とファイルに出力
$ echo "Hello, World!" | tee output.txt
Hello, World!
# lsの結果を表示しながらファイルに保存
$ ls -la | tee directory_list.txt
total 24
drwxr-xr-x 3 user user 4096 Aug 8 10:00 .
drwxr-xr-x 10 user user 4096 Aug 8 09:00 ..
-rw-r--r-- 1 user user 220 Aug 8 10:00 .bashrc
# 複数のファイルに同時出力
$ echo "Important message" | tee file1.txt file2.txt file3.txt
Important message
tee
は画面に表示しながらファイルに保存するので、処理の進行状況を確認しながら記録を残すことができます!
リダイレクトとの違い
リダイレクトとtee
の違いを理解しておきましょう。
# リダイレクト:画面には表示されない
$ echo "Hidden message" > file.txt
# (画面には何も表示されない)
# tee:画面に表示しながらファイルに保存
$ echo "Visible message" | tee file.txt
Visible message
# 標準エラー出力も含めて保存
$ command 2>&1 | tee complete_output.txt
重要なオプション
追記モード(-a)
ファイルに追記したい場合は-a
オプションを使います!
# ファイルを上書き(デフォルト)
$ echo "Line 1" | tee file.txt
Line 1
$ echo "Line 2" | tee file.txt # Line 1が消える
Line 2
# ファイルに追記
$ echo "Line 1" | tee file.txt
Line 1
$ echo "Line 2" | tee -a file.txt # 両方の行が保存される
Line 2
# ログファイルへの追記
$ date | tee -a activity.log
Thu Aug 8 10:00:00 JST 2024
$ echo "Task completed" | tee -a activity.log
Task completed
エラー無視(-i)
シグナルを無視して処理を継続したい場合は-i
オプションを使います。
# シグナルを無視して処理を継続
$ long_running_command | tee -i output.log
# Ctrl+Cで中断されても、それまでの出力は保存される
実践的な使用例
ログ記録
実際の作業でよく使われるログ記録の例を見てみましょう!
# スクリプトの実行ログを記録
$ ./deploy.sh | tee deployment_$(date +%Y%m%d_%H%M%S).log
# コマンドの実行時間も含めて記録
$ time make all 2>&1 | tee build.log
# 複数のログファイルに同時記録
$ ./backup.sh | tee -a backup.log /var/log/backup/$(date +%Y%m%d).log
デバッグとトラブルシューティング
デバッグ作業ではtee
が大活躍します!
# デバッグ出力を画面で見ながらファイルに保存
$ ./debug_script.sh | tee debug_output.txt
# エラーメッセージも含めて保存
$ problematic_command 2>&1 | tee error_log.txt
# パイプラインの途中経過を保存
$ cat data.txt | tee step1.txt | sort | tee step2.txt | uniq
システム管理
システム管理作業での活用例です。
# システム情報を表示しながら保存
$ df -h | tee disk_usage.txt
$ free -m | tee -a system_info.txt
$ ps aux | tee -a system_info.txt
# 設定変更のログ
$ echo "Changing configuration..." | tee -a /var/log/config_changes.log
$ vim /etc/nginx/nginx.conf
$ echo "Configuration updated at $(date)" | tee -a /var/log/config_changes.log
パイプラインでの活用
複数段階の処理
パイプラインの各段階の出力を保存できます!
# 各段階の出力を保存
$ cat raw_data.txt | \
tee stage1_raw.txt | \
grep "ERROR" | \
tee stage2_errors.txt | \
wc -l
# フィルタリングの過程を記録
$ tail -f /var/log/syslog | \
tee all_logs.txt | \
grep "WARNING\|ERROR" | \
tee filtered_logs.txt
データ処理の監視
大量のデータ処理を監視する際にも便利です。
# 処理の進行状況を確認
$ find /data -name "*.csv" | \
tee files_found.txt | \
xargs -I {} wc -l {} | \
tee line_counts.txt | \
awk '{sum+=$1} END {print "Total lines:", sum}'
# 長時間実行の監視
$ mysqldump database | tee backup.sql | gzip > backup.sql.gz
高度な使用方法
プロセス置換との組み合わせ
Bashのプロセス置換を使うと、さらに高度な処理ができます!
# 複数のコマンドに同時に渡す
$ echo "test data" | tee >(md5sum > checksum.txt) >(wc -c > size.txt)
# 異なる処理を並列実行
$ cat large_file.txt | tee \
>(grep "ERROR" > errors.txt) \
>(grep "WARNING" > warnings.txt) \
>(grep "INFO" > info.txt) > /dev/null
# 圧縮しながら元データも保存
$ tar -cf - /important/data | tee backup.tar | gzip > backup.tar.gz
標準エラー出力の扱い
標準エラー出力も含めて処理する方法です。
# 標準出力と標準エラー出力を別々に保存
$ command 2> >(tee stderr.log >&2) | tee stdout.log
# すべての出力を統合して保存
$ command 2>&1 | tee complete.log
リモートシステムとの連携
SSH接続でもtee
は活用できます!
# SSHセッションのログ
$ ssh user@server | tee ssh_session_$(date +%Y%m%d).log
# リモートコマンドの実行結果を保存
$ ssh user@server 'df -h; free -m; uptime' | tee remote_status.txt
# ファイル転送の記録
$ scp -v file.tar.gz user@server:/tmp/ 2>&1 | tee transfer.log
実用的なスクリプト例
バックアップスクリプト
実際のバックアップスクリプトの例を見てみましょう!
#!/bin/bash
# バックアップ実行と詳細ログ
LOG_FILE="/var/log/backup_$(date +%Y%m%d_%H%M%S).log"
{
echo "Backup started at $(date)"
echo "================================"
# データベースバックアップ
mysqldump mydb | tee mydb_backup.sql | gzip > mydb_backup.sql.gz
echo "Database backup completed"
# ファイルバックアップ
tar -czf backup.tar.gz /important/files 2>&1
echo "File backup completed"
echo "================================"
echo "Backup finished at $(date)"
} | tee "$LOG_FILE"
モニタリングスクリプト
システムモニタリングの例です。
#!/bin/bash
# システムモニタリングと記録
while true; do
{
echo "=== System Status at $(date) ==="
df -h
echo "---"
free -m
echo "---"
top -bn1 | head -20
echo ""
} | tee -a system_monitor.log
sleep 300 # 5分ごと
done
ベストプラクティス
ログローテーション
ログファイルが大きくなりすぎないように管理しましょう。
# 日付付きログファイル
$ command | tee "log_$(date +%Y%m%d).txt"
# サイズ制限付きログ
$ command | tee >(head -n 10000 > limited_log.txt)
# 古いログの自動削除
$ find /logs -name "*.log" -mtime +30 -delete
$ command | tee "/logs/output_$(date +%Y%m%d).log"
エラーハンドリング
エラーを適切に処理する方法です。
# teeの失敗を検知
if ! command | tee output.txt; then
echo "Command failed" >&2
exit 1
fi
# PIPESTATUSを使用した詳細なエラーチェック
command | tee output.txt
if [ ${PIPESTATUS[0]} -ne 0 ]; then
echo "Command failed with exit code ${PIPESTATUS[0]}"
fi
トラブルシューティング
よくある問題
tee
を使う際によく遭遇する問題と解決方法です。
# 権限エラー
$ command | sudo tee /root/output.txt # 正しい方法
# バッファリングの問題
# Pythonスクリプトの出力が表示されない
$ python -u script.py | tee output.txt # -uでバッファリング無効化
# パイプの破損
# 長時間実行でパイプが切れる
$ command | tee -i output.txt # -iでシグナル無視
🎮 理解度チェック
📝 まとめ
今回はtee
コマンドについて学びました!
tee
は標準出力とファイルに同時に出力できる便利なコマンド-a
オプションでファイルへの追記が可能- ログ記録やデバッグ作業で大活躍
- パイプラインの途中経過を保存できる
- プロセス置換と組み合わせることで高度な処理も可能
次はパイプとリダイレクトで、より高度なデータの流れの制御方法を学びましょう!