如何在grep中的每一行中添加一个时间戳


How to append a timestamp to each line as it comes out of grep?

我有一个来自记录器的无限数据流,我正在将其传输到grep。我想将grep的输出保存到一个文件中,但也要在每行的开头(该行出现的时间)包含一个时间戳。有没有一种简单的方法可以做到这一点?假设我无法更改记录器进程的输出。

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

... | sed "s/^/$(date) /" >> output.txt

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

... | gawk '{ print strftime(), $0 }'

你可以定义你喜欢的格式:

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

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

... | 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(来自更多实用程序):

... | 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) 问一个问题。