inuxのコマンドライン操作に慣れてくると、「出力を画面に表示しつつ、ファイルにも保存したい」といった場面に遭遇することがあります。例えば、ログを目で確認しながらファイルに記録したい、あるいは処理結果を確認しながら保存して後から再利用したいといったケースです。
そんな時に便利なのが、tee
コマンドです。tee
は標準入力を読み込み、その内容を標準出力とファイルの両方に同時に出力することができるユニークなツールです。
この記事では、tee
コマンドの基本的な使い方から応用例、オプションの解説まで、わかりやすく丁寧に紹介します。
tee
コマンドは、Unix系OSにおいて、標準入力を読み取り、標準出力に表示しながら、同時にファイルにも書き込むことができるコマンドです。
この名前の由来は、配管のT字型分岐(tee fitting)から来ています。つまり、データの流れを2つに分けるという意味で「tee」と呼ばれています。
基本構文:
コマンド | tee [オプション] ファイル名
ここでの「コマンド」は、標準出力を生成する任意のコマンドです。それをtee
で受け取り、標準出力に表示しながらファイルにも出力します。
まずは基本的な使い方を見てみましょう。
ls -l | tee output.txt
このコマンドは、ls -l
の出力結果をターミナルに表示しながら、同時にoutput.txt
というファイルに書き込みます。
ファイルは新規作成され、すでに存在する場合は上書きされます。
tee
コマンドは、1つの出力を複数ファイルに分けて保存することもできます。
echo "Hello, World!" | tee file1.txt file2.txt
この例では、”Hello, World!” という文字列を標準出力に表示しながら、file1.txt
とfile2.txt
の両方に同時に出力します。
通常、tee
は指定したファイルを上書きします。しかし、既存の内容を残したまま追記したい場合は、-a
オプション(または--append
)を使用します。
date | tee -a log.txt
このコマンドは、現在の日時をlog.txt
に追記しつつ、画面にも表示します。
sudo
での書き込みが必要なファイルに対して、リダイレクト(>
)ではうまくいかないことがあります。以下の例は失敗するケースです:
echo "test" > /etc/somefile
このような場合、tee
を使うことで正しく書き込むことができます。
echo "test" | sudo tee /etc/somefile
この方法なら、sudo
の権限がtee
に適用されるため、書き込みが許可されていない場所にも安全に出力できます。
長時間実行されるスクリプトやコマンドの出力をリアルタイムに確認しつつ、ログとして残すのにtee
は非常に便利です。
./long_process.sh | tee process.log
この例では、シェルスクリプトlong_process.sh
の出力をターミナルに表示しつつ、process.log
に記録します。
tee
はパイプラインの途中に組み込むことで、処理の途中経過をファイルに保存することもできます。
cat access.log | grep "404" | tee errors.log | wc -l
この例では、access.log
の中から”404″を含む行を抽出して、errors.log
に保存。その後、その件数をカウントしています。
出力を一時的に捨てたい場合は、/dev/null
と組み合わせることもあります。
some_command | tee /dev/null
このように書くことで、some_command
の出力をすべて無視することができますが、パイプ処理としては成立しているので、他のパイプラインとの連携も可能です。
tee
はバッファリングされるため、リアルタイム性が完全ではないことがあります(ただし通常の使用ではほとんど気になりません)。-a
)の使用を検討しましょう。tee
コマンドは、「出力をそのまま見たいし、記録も残したい」といったニーズにぴったりの便利なツールです。標準出力とファイルへの出力を両立できるため、スクリプトのログ記録やデバッグ、システム管理の場面で幅広く使われています。
特にsudo
との組み合わせや-a
オプションによる追記モードなど、日常的な作業に役立つテクニックも多くあります。
Linuxでの作業効率を高めたい方は、ぜひtee
コマンドを覚えておきましょう。