awkで他のコマンドの実行結果に一行ごとにタイムスタンプを付与する

個人的によく利用するので、備忘として残しておく。
pingやvmstatなどでコマンドを定期実行した際に、いつ・どのような結果になったのか残しておきたいのに、タイムスタンプを残す機能がコマンドに備わってない場合に有効だ。

やり方は簡単で、以下のように対象のコマンドとawkをパイプでつなぐだけだ。

コマンド | awk '{print strftime("%F %T ") $0}'

[root@BS-PUB-CENT7-01 ~]# ping 8.8.8.8 | awk '{print strftime("%F %T ") $0}'
2016-06-01 08:47:02 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
2016-06-01 08:47:02 64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=4.34 ms
2016-06-01 08:47:03 64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=4.60 ms
2016-06-01 08:47:04 64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=4.67 ms
2016-06-01 08:47:05 64 bytes from 8.8.8.8: icmp_seq=4 ttl=53 time=4.43 ms
2016-06-01 08:47:06 64 bytes from 8.8.8.8: icmp_seq=5 ttl=53 time=4.74 ms
2016-06-01 08:47:07 64 bytes from 8.8.8.8: icmp_seq=6 ttl=53 time=4.54 ms
2016-06-01 08:47:08 64 bytes from 8.8.8.8: icmp_seq=7 ttl=53 time=4.74 ms
2016-06-01 08:47:09 64 bytes from 8.8.8.8: icmp_seq=8 ttl=53 time=4.31 ms
2016-06-01 08:47:10 64 bytes from 8.8.8.8: icmp_seq=9 ttl=53 time=4.24 ms


2016/06/08 追記

なお、外部ファイルにリダイレクトで結果を書き出す場合は、awkを以下のように記述してやる必要がある。

コマンド | awk '{print strftime("%F %T ") $0}{fflush() }' > リダイレクト先PATH
[root@BS-PUB-CENT7-01 ~]# ping -c 10 8.8.8.8 | awk '{print strftime("%F %T ") $0}{fflush() }' >
 test.log
[root@BS-PUB-CENT7-01 ~]# cat test.log
2016-06-08 00:00:22 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
2016-06-08 00:00:22 64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=4.82 ms
2016-06-08 00:00:23 64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=4.55 ms
2016-06-08 00:00:24 64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=4.53 ms
2016-06-08 00:00:25 64 bytes from 8.8.8.8: icmp_seq=4 ttl=53 time=4.64 ms
2016-06-08 00:00:26 64 bytes from 8.8.8.8: icmp_seq=5 ttl=53 time=4.55 ms
2016-06-08 00:00:27 64 bytes from 8.8.8.8: icmp_seq=6 ttl=53 time=4.68 ms
2016-06-08 00:00:28 64 bytes from 8.8.8.8: icmp_seq=7 ttl=53 time=4.59 ms
2016-06-08 00:00:29 64 bytes from 8.8.8.8: icmp_seq=8 ttl=53 time=4.55 ms
2016-06-08 00:00:30 64 bytes from 8.8.8.8: icmp_seq=9 ttl=53 time=4.62 ms
2016-06-08 00:00:31 64 bytes from 8.8.8.8: icmp_seq=10 ttl=53 time=4.64 ms
2016-06-08 00:00:31
2016-06-08 00:00:31 --- 8.8.8.8 ping statistics ---
2016-06-08 00:00:31 10 packets transmitted, 10 received, 0% packet loss, time 9016ms
2016-06-08 00:00:31 rtt min/avg/max/mdev = 4.530/4.619/4.829/0.112 ms