如何将时间戳添加到管道输出?

时间:2013-12-13 15:12:07

标签: perl bash pipe

我需要在长执行命令的输出前添加一个时间戳(在我的用例中使用“tcpdump”)。

它 - 非常简化 - 看起来像这样:

(echo A1; sleep 3; echo B2) | perl -MPOSIX -pe 'print strftime "%T ", localtime $^T; s/\d//'

给出了这种输出:

16:10:24 A
16:10:24 B

即:perl的localtime(显然)在调用perl时被调用。

相反,我需要这样的结果:

16:10:24 A
16:10:27 B

即:时间戳应该相对于输入的生成时间......

任何智能(或不那么聪明的:-)解决方案?

4 个答案:

答案 0 :(得分:2)

只需从Perl命令中删除$^T即可。这样,您将使用当前时间而不是进程开始时间。请参阅docs for $^T

然而,使用Perl的更优雅的配方是:

... | perl -MPOSIX -ne's/\d//; print strftime("%T ", localtime), $_'

答案 1 :(得分:1)

您可以将输出传递给:

awk '{ print strftime("%T"), $0; }'

示例:

while : ; do echo hey; sleep 1; done | awk '{ print strftime("%T"), $0; }'
20:49:58 hey
20:49:59 hey
20:50:00 hey
20:50:01 hey
20:50:02 hey
20:50:03 hey
20:50:04 hey
20:50:05 hey

或者,您可以使用ts

ts '%T'

答案 2 :(得分:1)

(echo A1; sleep 3; echo B2) | perl -MPOSIX -pe 'print strftime "%T ", localtime; s/\d//'

对我来说非常好。为什么你在那里添加$^T

答案 3 :(得分:0)

在Linux上,您可以使用tcpdump -tttt在每个输出行之前打印时间戳。

# tcpdump -tttt -c 1 2>/dev/null
2013-12-13 23:42:12.044426 IP 10.0.2.15.ssh > 10.0.2.2.53466: Flags [P.], seq 464388005:464388121, ack 16648998, win 65535, length 116

如果你的tcpdump没有-tttt选项,你应该使用devnull中的awk