对标准输出的每行进行时间戳



我在寻求建议。

我想有一个时间戳的每一行我的标准输出。

因此,当我使用返回大量信息的脚本时,我可以用时间和日期跟踪每个返回。

我可以很容易地为我所做的每个命令添加时间戳,但我不能为每个返回得到它。

谢谢!

不要重新发明轮子,使用现有的解决方案。在几乎所有发行版上都可以使用的moreutils包包含ts。这是完全为您的用例编写的:

$ cmd | ts

例如:

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts
Feb 09 14:34:51 a
Feb 09 14:34:52 b
Feb 09 14:34:55 c
Feb 09 14:34:57 d

注意:当写入管道而不是终端时,程序的输出将被libc块缓冲,而不是默认的行缓冲。

这意味着时间戳将是标准输出被刷新的时刻,这并不一定与写入一行的时刻相同。stdbuf可以在Linux上用于强制行缓冲输出:

stdbuf -oL cmd | ts

PS:在MacOS上有unbuffer用于相同的目的

需要担心缓冲问题,但通常这样做就足够了:

cmd | perl -ne 'printf "%s: %s",  scalar localtime(), $_'

但是我得到的印象是你正在寻找一个更通用的解决方案来拦截所有的命令。比如:

$ mkfifo /tmp/fifo
$ perl -ne 'print scalar localtime(), ": ", $_' < /tmp/fifo &
[1] 57567
$ exec > /tmp/fifo
$ echo foo
Tue Feb  9 13:34:04 2021: foo
$ echo bar
Tue Feb  9 13:34:12 2021: bar

您可以通过read管道输出程序,并逐行附加日期:

your_programm | while read l; do echo "$(date): $l"; done

当然你也可以格式化date的输出。

最新更新