如何从grep中添加时间戳到每一行?

Tim*_*Tim 5 php logging grep timestamp

我有一个无限的数据流来自记录器,我正在为grep管道.我想将grep的输出保存到文件中,但还要在每行的开头(行出现的时间)中包含一个时间戳.有没有一种简单的方法来实现这一目标?假设我无法更改记录器进程的输出.

Ste*_*eve 6

您可以使用和附加静态时间戳:seddate

... | sed "s/^/$(date) /" >> output.txt
Run Code Online (Sandbox Code Playgroud)

或者,如果您需要实时时间戳,请使用gawk's strftime函数:

... | gawk '{ print strftime(), $0 }'
Run Code Online (Sandbox Code Playgroud)

您可以定义自己喜欢的格式:

... | gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }'
Run Code Online (Sandbox Code Playgroud)

如果缓冲是一个问题,请不要忘记刷新每一行:

... | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush() }'
Run Code Online (Sandbox Code Playgroud)

或者,使用unbuffer:

unbuffer ... | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }'
Run Code Online (Sandbox Code Playgroud)

如果您没有gawk,您还有其他几种选择:

(a)安装ts(来自moreutils):

... | ts '%F %T'
Run Code Online (Sandbox Code Playgroud)

(b)使用perl:

... | perl -pe 's/^/localtime . " "/e'
Run Code Online (Sandbox Code Playgroud)

或格式化:

... | perl -MPOSIX -pe 's/^/strftime("%Y-%m-%d %H:%M:%S", localtime) . " "/e'
Run Code Online (Sandbox Code Playgroud)

不要忘记,如果您需要格式化为您的语言环境的GMT gmtime,localtime则可以使用.

(c)提出问题.