我有一个无限的数据流来自记录器,我正在为grep管道。我想将grep的输出保存到文件中,但还要在每行的开头(行出现的时间)中包含一个时间戳。有没有一种简单的方法来实现这一目标?假设我无法更改记录器过程的输出。
答案 0 :(得分:5)
您可以使用sed
和date
追加静态时间戳:
... | sed "s/^/$(date) /" >> output.txt
或者,如果您需要实时时间戳,请使用gawk
的{{3}}:
... | gawk '{ print strftime(), $0 }'
您可以定义自己喜欢的格式:
... | gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }'
如果缓冲是一个问题,请不要忘记每行strftime function:
... | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush() }'
或者,使用unbuffer
:
unbuffer ... | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }'
如果您没有gawk
,则有几个其他选项:
(a)安装ts
(来自flush):
... | ts '%F %T'
(b)使用perl
:
... | perl -pe 's/^/localtime . " "/e'
或格式化:
... | perl -MPOSIX -pe 's/^/strftime("%Y-%m-%d %H:%M:%S", localtime) . " "/e'
如果您需要格式化为您的语言区域的GMT,请不要忘记您可以使用gmtime
代替localtime
。
(c)moreutils。