我需要在长执行命令的输出前添加一个时间戳(在我的用例中使用“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
即:时间戳应该相对于输入的生成时间......
任何智能(或不那么聪明的:-)解决方案?
答案 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