在程序打印到标准输出的每个新行前面放置一个文本

在程序打印到标准输出的每个新行前面放置一个文本

所以我想做一些日志记录,因此想在 bash 脚本的输出前面放一个日期。问题是它有多行输出。我只能在整个输出之前放上日期。但是日志中有一行没有日期。当然我可以假设上面那行的日期是相同的,但我希望有一个解决方案。提前谢谢!

这是我的脚本,它调用了另一个脚本:

#!/bin/sh
echo $(date "+%F %T") : starting script
echo $(date "+%F %T") : $(./script.sh)
echo $(date "+%F %T") :script ended

这是输出:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
second line of output
2012-07-26 15:35:17 : script ended

这就是我想要的:

2012-07-26 15:34:12 : starting script
2012-07-26 15:35:14 : First line of output
2012-07-26 15:35:15 : second line of output
2012-07-26 15:35:17 : script ended

答案1

根据Stack Overflow 上的类似问题,有 2 个不错的选择。

awk(回答

<command> | awk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; }'

注释(回答

注释是一个小型 bash 脚本,可以通过此处提供的链接直接获取,或者在基于 Debian 的系统上通过包devscripts(以 的形式annotate-output)获取。

答案2

我认为您可以使用 awk 来实现这一点:

./script.sh | awk '{ print strftime()" : "$0; }'

(看http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html用于格式化 strftime() 返回的日期)

答案3

您可以使用awk

./script.sh | awk '{ print d,$1}' "d=$(date "+%F %T")"

awk接受输入流并修改其输出。此脚本表示“打印 d,然后打印原始输出”,然后填充d日期。

答案4

这将在每行输出之前打印当前日期和时间./script.sh

set -f
./script.sh | while read -r LINE; do echo $(date "+%F %T") : "$LINE"; done
set +f

怎么运行的

  • set -f关闭 bash 扩展(或echo *不会打印实际的星号)。

  • while read -r LINE; do ... done将一行输出保存在变量中$LINE并执行...,直到处理完所有行。

  • echo $(date "+%F %T") :“$LINE”打印包含当前时间和日期的行。

  • set +f重新打开 bash 扩展,这样它就不会干扰 bash 脚本的其余部分。

相关内容