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

前端之家收集整理的这篇文章主要介绍了shell – 如何添加时间戳到STDERR重定向前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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行写入到所需的文件

猜你在找的Bash相关文章