【tee】コマンドの実行結果を標準出力(画面)とファイルに出力させる方法

「tee」を使ってコマンドの実行結果をファイルに出力

コマンドの実行結果を標準出力(画面)とファイルに出力したい場合には、実行するコマンドと「tee」コマンドを「|」(パイプ)で繋げてあげることで、両方に出力させることが出来ます。

コマンド | tee ファイル名

実際に「ping」と「tee」を組み合わせて実行してみます。

「ping」の実行結果は標準出力(画面)にも表示されています。

$ ping -c 5 8.8.8.8 | tee ping.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.894 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.948 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=1.09 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=59 time=0.969 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=59 time=1.06 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 0.894/0.994/1.093/0.077 ms

次に、実行結果を出力させるために指定した「ping.log」ファイルの中身をみてみると、pingの実行結果が記録されていることが確認できました。

$ cat ping.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.894 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.948 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=1.09 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=59 time=0.969 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=59 time=1.06 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 0.894/0.994/1.093/0.077 ms

このように「tee」コマンドと組み合わせることで、色々なコマンドの実行結果が簡単にファイルに出力させることが出来ます。

teeコマンドのオプション

「tee」コマンドで使用できるオプションについて説明します。

  • -a ファイルに追記
  • -i 割り込み信号(Ctrl + c )を無視する

-a オプション

「-a」オプションを使うと、コマンドの実行結果をファイルに追記することが出来ます。

実際に「-a」オプションを使って実行結果をファイルに追記してみます。

$ ping -c 5 8.8.8.8 | tee -a ping.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.940 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=1.00 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=1.00 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=59 time=0.985 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=59 time=0.954 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 0.940/0.976/1.002/0.037 ms

ファイルの中身を確認すると、実行結果が追記されていることが確認できました。

$ cat ping.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.894 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.948 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=1.09 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=59 time=0.969 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=59 time=1.06 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 0.894/0.994/1.093/0.077 ms
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.940 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=1.00 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=1.00 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=59 time=0.985 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=59 time=0.954 ms
--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4004ms
rtt min/avg/max/mdev = 0.940/0.976/1.002/0.037 ms

-i オプション

「-i」オプションを使用すると、割り込み信号(Ctrl + c )を無視することができます。(ちょっと使い道が思いつきません…)

エラー(標準エラー)もファイルに出力させたい

コマンドの実行結果がエラーの場合、そのまま「tee」コマンドと組み合わせてもエラーメッセージはファイルには出力されません。

実際に存在しないファイルを「cat」コマンドで確認してみると、「cat: foo.txt: No such file or directory」とエラーメッセージが画面上には表示されますが、ファイルには何も出力されていません。

$ cat foo.txt | tee cat.log
cat: foo.txt: No such file or directory
$ cat cat.log

エラーの内容もファイルに出力させたい場合は、「2>&1」として標準エラー出力を標準出力に出力させましょう。

$ cat foo.txt 2>&1 | tee cat.log
cat: foo.txt: No such file or directory

エラーメッセージがファイルに書き込まれていることが確認できました。

$ cat cat.log
cat: foo.txt: No such file or directory

複数ファイルに書き出す

「tee」コマンドで指定するファイルを複数指定することで、複数のファイルにコマンドの実行結果を書き出すことができます。

コマンド | tee ファイル1 ファイル2 ファイル3

実際に「ping1.log」「ping2.log」「ping3.log」という3つのファイルに「ping」コマンドの実行結果を出力させてみます。

$ ping -c 3 8.8.8.8 | tee ping1.log ping2.log ping3.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.941 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.989 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=0.973 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.941/0.967/0.989/0.041 ms

指定した3つのファイルを確認してみると、それぞれに実行結果が出力されていました。

$ cat ping1.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.941 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.989 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=0.973 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.941/0.967/0.989/0.041 ms
$ cat ping2.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.941 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.989 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=0.973 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.941/0.967/0.989/0.041 ms
$ cat ping3.log
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=0.941 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=0.989 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=59 time=0.973 ms

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.941/0.967/0.989/0.041 ms

シェアする