如何为流式传输到stdout的UNIX命令的每一行添加时间戳?

时间:2016-08-30 05:00:23

标签: unix command-line stdout unix-timestamp

假设我想为ping google.com之类的命令添加时间戳,以便输出看起来像

[9:48:56]PING google.com (116.28.94.14): 56 data bytes
[9:48:55]64 bytes from 116.28.94.14: icmp_seq=0 ttl=54 time=13.118 ms
[9:48:57]64 bytes from 116.28.94.14: icmp_seq=1 ttl=54 time=13.943 ms
[9:48:58]64 bytes from 116.28.94.14: icmp_seq=2 ttl=54 time=19.103 ms
[9:48:59]64 bytes from 116.28.94.14: icmp_seq=3 ttl=54 time=12.854 ms

我已经研究了使用xargawk之类的管道和命令的奇特方法,但我无法做到这一点。另外,让我们假设我所拥有的环境不允许我使用像stdbuffunbuff这样的花哨的东西。如果可能的话,使用类似unix的方法实现这一目标真是太棒了。谢谢!

2 个答案:

答案 0 :(得分:0)

这是绝对最简单和最愚蠢的方法:

$ while read -r line ; do echo "$(date "+%H:%M:%S"): $line" ; done < <(while true ; do echo foo ; sleep 1 ; done)
00:07:08: foo
00:07:09: foo
00:07:10: foo
00:07:11: foo
00:07:12: foo

您可以根据需要设置时间戳的格式并运行您想要的任何命令:

$ while read -r line ; do echo "$(date "+%s"): $line" ; done < <(ping google.com)
1472533833: PING google.com (216.58.216.78): 56 data bytes
1472533833: 64 bytes from 216.58.216.78: icmp_seq=0 ttl=55 time=11.391 ms
1472533834: 64 bytes from 216.58.216.78: icmp_seq=1 ttl=55 time=12.746 ms
1472533835: 64 bytes from 216.58.216.78: icmp_seq=2 ttl=55 time=10.912 ms
1472533836: 64 bytes from 216.58.216.78: icmp_seq=3 ttl=55 time=13.065 ms
1472533837: 64 bytes from 216.58.216.78: icmp_seq=4 ttl=55 time=10.684 ms

这里它是一个shell函数:

function logger {
  while read -r line ; do
    echo "$(date "+%H:%M:%S"): $line"
  done < <($*)
}

奇怪的命令和命令输出可能会破坏它,因此可能需要进行一些额外的调整,但希望这对你来说是一个好的开始。

编辑:一些快速的Google搜索引发了一些线索,其中包含一些很棒的答案here

答案 1 :(得分:0)

moreutils 1 中的ts命令(对于&#34;时间戳&#34;)完全是为了这个。要将时间戳添加到ping输出格式,就像您的示例一样,您可以使用

ping google.com | ts '[%H:%M:%S]'

我不知道这是否属于&#34;花哨的方式使用烟斗&#34;但是我会说这是一种很好的单一方式,从你和&#34; #39;重新使用does one thing and does it well

的工具

1 您可以使用sudo apt-get install moreutils在Debian / Ubuntu中安装moreutils。