【问题标题】:Preappend timestamp in shell script which has embedded redirection在嵌入了重定向的 shell 脚本中添加时间戳
【发布时间】:2016-09-20 16:09:01
【问题描述】:

我有一个如下所示的 unix shell 脚本。我想在 out.log 的每一行前面附加一个时间戳。一般的解决方案是创建另一个脚本 preappend.sh 并像这样执行脚本:

(./a.sh 2>&1 ) | ./b.sh > out.log

然而,原来的 shell 脚本有一行 exec 2>out.log(我已经在下面对此进行了注释以供我之前的测试使用)。在现实生活中,这条线没有评论。当有exec 2> 到位时,有人可以教我如何在 out.log 中预先附加时间戳吗?

本尼

------ my script a.sh ---------
#!/bin/sh

#exec 2>out.log
set -x

echo 'hello world'
sleep 2
echo 'you rocks'
------end---------

---- preappend.sh ---
#!/bin/bash
while read line ; do
    echo "$(date '+%Y%m%d %H:%M:%S'): ${line}"
done
-------end------------

【问题讨论】:

  • 如果我用这个替换exec 2> out.log。它会起作用的。 exec 2> >(while read line ; do echo "$(date '+%Y%m%d %H:%M:%S'): ${line}"; done > out.log) 但是有没有不编辑 a.sh 的方法?

标签: shell unix


【解决方案1】:

这是否解决了问题:

origScript.sh 2>&1 | awk '{ printf strftime() " " $0 "\n" }'

我们可以做一个小测试来检查这是否有效 -

while [ 1 ]
do
  date
  (>&2 echo "error")
  sleep 1
done 2>&1 | awk '{ printf strftime() " " $0 "\n" }'

它返回如下内容:

Tue Sep 20 19:11:43 UTC 2016 Tue Sep 20 19:11:43 UTC 2016
Tue Sep 20 19:11:43 UTC 2016 error
Tue Sep 20 19:11:44 UTC 2016 Tue Sep 20 19:11:44 UTC 2016
Tue Sep 20 19:11:44 UTC 2016 error
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 2016-01-14
    • 2010-09-05
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多