加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell – 如何添加时间戳到STDERR重定向

发布时间:2020-12-15 09:19:36 所属栏目:安全 来源:网络整理
导读:在bash / ksh中我们可以添加时间戳到STDERR重定向? 例如。 myscript.sh 2 error.log 我想在日志上写一个时间戳。 如果你正在谈论每一行的最新时间戳,这是你可能想在你的实际脚本中做的事情(但如果你没有权力改变它,下面的一个漂亮的解决方案)。如果你只是
在bash / ksh中我们可以添加时间戳到STDERR重定向?

例如。 myscript.sh 2> error.log

我想在日志上写一个时间戳。

如果你正在谈论每一行的最新时间戳,这是你可能想在你的实际脚本中做的事情(但如果你没有权力改变它,下面的一个漂亮的解决方案)。如果你只是想要一个标记日期在自己的一行,然后你的脚本开始写作,我会使用:
( date 1>&2 ; myscript.sh ) 2>error.log

你需要的是一个技巧,管道stderr通过另一个程序,可以添加时间戳每行。你可以用一个C程序做到这一点,但有一个更加狡猾的方式使用bash。

首先,创建一个脚本,将时间戳添加到每一行(称为predate.sh):

#!/bin/bash
while read line ; do
    echo "$(date): ${line}"
done

例如:

( echo a ; sleep 5 ; echo b ; sleep 2 ; echo c ) | ./predate.sh

产生:

Fri Oct  2 12:31:39 WAST 2009: a
Fri Oct  2 12:31:44 WAST 2009: b
Fri Oct  2 12:31:46 WAST 2009: c

然后你需要另一个技巧,可以交换stdout和stderr,这个小怪物在这里:

( myscript.sh 3>&1 1>&2- 2>&3- )

然后很简单的结合两个技巧的时间戳stdout并将它重定向到你的文件:

( myscript.sh 3>&1 1>&2- 2>&3- ) | ./predate.sh >error.log

以下脚本演示了此操作:

pax> cat predate.sh
    #!/bin/bash
    while read line ; do
        echo "$(date): ${line}"
    done
pax> cat tstdate.sh
    #!/bin/bash
    echo a to stderr then wait five seconds 1>&2
    sleep 5
    echo b to stderr then wait two seconds 1>&2
    sleep 2
    echo c to stderr 1>&2
    echo d to stdout
pax> ( ( ./tstdate.sh ) 3>&1 1>&2- 2>&3- ) | ./predate.sh >error.log
    d to stdout
pax> cat error.log
    Fri Oct  2 12:49:40 WAST 2009: a to stderr then wait five seconds
    Fri Oct  2 12:49:45 WAST 2009: b to stderr then wait two seconds
    Fri Oct  2 12:49:47 WAST 2009: c to stderr

如前所述,predate.sh将在每一行前面加上一个时间戳,而tstdate.sh只是一个测试程序,以特定的时间间隔写入stdout和stderr。

当你运行命令,你实际上得到“d to stdout”写到stderr(但这是你的TTY设备或任何其他stdout可能是当你开始)。带时间戳的stderr行写入到所需的文件。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读