「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
コメント