gnomon』という、出力に処理の経過時間を付与してくれるというツールを見かけたのだが、似たような事をシェル芸なりでできないかと思ったのでやってみることにした。 元々がmoreutilsのtsコマンドを発想元にしているということなので、以下のようにtsコマンドを利用すれば同様の事ができるようだ。

cmd | ts -s # 作業全体の経過時間
cmd | ts -i # 直前の出力からの経過時間
blacknon@BS-PUB-UBUNTU-01:~$ yes 'echo test_$(date +%Y%m%d_%H%M%S);sleep $((RANDOM%5))' | head -10 | bash | ts -s
00:00:00 test_20171210_190930
00:00:02 test_20171210_190932
00:00:04 test_20171210_190934
00:00:08 test_20171210_190938
00:00:11 test_20171210_190941
00:00:14 test_20171210_190944
00:00:17 test_20171210_190947
00:00:21 test_20171210_190951
00:00:23 test_20171210_190953
00:00:27 test_20171210_190957
blacknon@BS-PUB-UBUNTU-01:~$ yes 'echo test_$(date +%Y%m%d_%H%M%S);sleep $((RANDOM%5))' | head -10 | bash | ts -i
00:00:00 test_20171210_191004
00:00:03 test_20171210_191007
00:00:02 test_20171210_191009
00:00:00 test_20171210_191009
00:00:04 test_20171210_191013
00:00:03 test_20171210_191016
00:00:01 test_20171210_191017
00:00:02 test_20171210_191019
00:00:01 test_20171210_191020
00:00:00 test_20171210_191020

じゃ、moreutilsが入ってない環境だとどうすればいいんだということで、とりあえずawkで書いてみることにした。

cmd | TZ=UTC awk 'BEGIN{x=systime()}{print strftime("%H:%M:%S",systime()-x),$0}{fflush()}' # 作業全体の経過時間
cmd | TZ=UTC awk 'BEGIN{x=systime()}{z=systime();print strftime("%H:%M:%S",z-x),$0;x=systime()}{fflush()}' # 直前の出力からの経過時間
blacknon@BS-PUB-UBUNTU-01:~$ yes 'echo test_$(date +%Y%m%d_%H%M%S);sleep $((RANDOM%5))' | head -10 | bash | TZ=UTC awk 'BEGIN{x=systime()}{print strftime("%H:%M:%S",systime()-x),$0}{fflush()}'
00:00:00 test_20171210_191718
00:00:01 test_20171210_191719
00:00:03 test_20171210_191721
00:00:06 test_20171210_191724
00:00:09 test_20171210_191727
00:00:09 test_20171210_191727
00:00:13 test_20171210_191731
00:00:17 test_20171210_191735
00:00:19 test_20171210_191737
00:00:19 test_20171210_191737
blacknon@BS-PUB-UBUNTU-01:~$ yes 'echo test_$(date +%Y%m%d_%H%M%S);sleep $((RANDOM%5))' | head -10 | bash | TZ=UTC awk 'BEGIN{x=systime()}{z=systime();print strftime("%H:%M:%S",z-x),$0;x=systime()}{fflush()}'
00:00:00 test_20171210_191827
00:00:01 test_20171210_191828
00:00:04 test_20171210_191832
00:00:01 test_20171210_191833
00:00:02 test_20171210_191835
00:00:04 test_20171210_191839
00:00:03 test_20171210_191842
00:00:02 test_20171210_191844
00:00:02 test_20171210_191846
00:00:01 test_20171210_191847