在程序要打印到stdout的每个新行之前放置一个文本


9

因此,我想进行一些日志记录,并希望在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

我不认为您可以只更改第二个脚本?
jmetz 2012年

不,可惜没有。这就是为什么我来这里。
tzippy 2012年

Answers:


9

根据关于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 d,$1}' "d=$(date "+%F %T")"

awk接受输入流并修改其输出。该脚本说的是“ print d,然后是原始输出”,然后填充d日期。


1
这样是否也不date只对表达式求值一次,以便所有这些行同时打印?
丹尼尔·贝克

@DanielBeck是它-我曾以为这是每次拿起日期,但刚刚完成我的测试速度不够快
保罗

1

这将在输出的每一行之前打印当前日期和时间./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脚本的其余部分。


它仅被评估一次,因此每个sed元素都将在开始第二个脚本之前插入相同的日期。可能不是用户想要的...
丹尼尔·贝克

我认为这种尝试也不可行。AFAIK,首先完全评估整个子外壳,然后遍历循环。因此,现在的时间是执行的时间。
丹尼尔·贝克

您的示例无效,因为您仅延迟输出,而不执行ls。只需尝试以下脚本即可script.sh#!/bin/bash(newline)echo 1 ; sleep 1 ; echo 2 ; sleep 2 ; echo 3 ; sleep 3 ; echo 4
Daniel Beck

使用read具有while循环,而不是一个for循环。
chepner

@chepner:好主意。
丹尼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.