コマンドの実行結果を、標準出力で確認しつつファイルにも出力させる場合や、複数のファイルに出力させたい事がある。 そんなときはteeコマンドを使うと便利だ。 今回は、このteeコマンドの使い方についてをまとめてみることにする。

1. 基本的な使い方

基本的には、以下の様にコマンドを実行することで、標準入力から受け付けた内容を指定したファイルと標準出力に出してくれる。

コマンド | tee ファイル
blacknon@BS-PUB-DEVELOP:~$ echo {1..5}
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~$ echo {1..5} | tee test15
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~$ cat test15
1 2 3 4 5

複数のファイルに出力させる場合、ファイル指定時にスペース区切りで複数指定できる。

コマンド | tee ファイル1 ファイル2 ...
blacknon@BS-PUB-DEVELOP:~/test123$ ls
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {1..5}
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {1..5} | tee test{1..5}
1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ ls
test1  test2  test3  test4  test5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:1 2 3 4 5
./test2:1 2 3 4 5
./test3:1 2 3 4 5
./test4:1 2 3 4 5
./test5:1 2 3 4 5

2. ファイルに追記させる

teeコマンドでは、デフォルトではファイルへの書き込みは上書きモードで行われてしまう。 これを上書きではなく追記で行わせるには、「-a」オプションを付与すれば良い。

コマンド | tee -a ファイル1 ファイル2 ...
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:1 2 3 4 5
./test2:1 2 3 4 5
./test3:1 2 3 4 5
./test4:1 2 3 4 5
./test5:1 2 3 4 5
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10}
01 02 03 04 05 06 07 08 09 10
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10} | tee test{1..5}
01 02 03 04 05 06 07 08 09 10
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:01 02 03 04 05 06 07 08 09 10
./test2:01 02 03 04 05 06 07 08 09 10
./test3:01 02 03 04 05 06 07 08 09 10
./test4:01 02 03 04 05 06 07 08 09 10
./test5:01 02 03 04 05 06 07 08 09 10
blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {11..20} | tee -a test{1..5}
11 12 13 14 15 16 17 18 19 20
blacknon@BS-PUB-DEVELOP:~/test123$ grep '' ./test*
./test1:01 02 03 04 05 06 07 08 09 10
./test1:11 12 13 14 15 16 17 18 19 20
./test2:01 02 03 04 05 06 07 08 09 10
./test2:11 12 13 14 15 16 17 18 19 20
./test3:01 02 03 04 05 06 07 08 09 10
./test3:11 12 13 14 15 16 17 18 19 20
./test4:01 02 03 04 05 06 07 08 09 10
./test4:11 12 13 14 15 16 17 18 19 20
./test5:01 02 03 04 05 06 07 08 09 10
./test5:11 12 13 14 15 16 17 18 19 20

3. 他の複数のコマンドにデータを渡す

こちらでも以前記述したのだが、teeコマンドを利用することで、ファイルではなく他のコマンドに標準入力を渡すことも可能だ。 コマンドの実行結果の出力順は順不同、通常の標準出力も表示されてしまうのだが、パイプで複数のコマンドに標準入力の内容を渡すことができるのは便利だ。

コマンド | tee >(コマンド1) >(コマンド2) ...
コマンド | tee >(コマンド1) >(コマンド2) ... 1>/dev/null
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10} | tee >(sed 's/1/a/g') >(sed 's/2/b/g') >(sed 's/3/c/g')
01 02 03 04 05 06 07 08 09 10
0a 02 03 04 05 06 07 08 09 a0
01 0b 03 04 05 06 07 08 09 10
01 02 0c 04 05 06 07 08 09 10

blacknon@BS-PUB-DEVELOP:~/test123$
blacknon@BS-PUB-DEVELOP:~/test123$ echo {01..10} | tee >(sed 's/1/a/g') >(sed 's/2/b/g') >(sed 's/3/c/g') 1>/dev/null
0a 02 03 04 05 06 07 08 09 a0
01 0b 03 04 05 06 07 08 09 10
01 02 0c 04 05 06 07 08 09 10