假设我想为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
我已经研究了使用xarg
和awk
之类的管道和命令的奇特方法,但我无法做到这一点。另外,让我们假设我所拥有的环境不允许我使用像stdbuff
或unbuff
这样的花哨的东西。如果可能的话,使用类似unix的方法实现这一目标真是太棒了。谢谢!
答案 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。