首页 > 解决方案 > 为标准输出的每一行加时间戳

问题描述

我正在寻求建议。

我想为我的标准输出的每一行设置一个时间戳。

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

我可以轻松地为我所做的每个命令添加一个时间戳,但我无法为每个返回获取它。

谢谢 !

标签: bashshell

解决方案


不要重新发明轮子,使用现有的解决方案。几乎所有发行版都提供的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同样的目的


推荐阅读