所以我想做一些日志记录,因此想在 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 脚本的其余部分。