Bash:将命令输出和时间戳附加到文件

时间:2012-05-31 18:12:42

标签: bash shell

通常在我的bash脚本中,我习惯做some_command >> log.log。这工作正常,但是如何添加更多数据,如时间和命令名称?

我的目标是拥有这样的日志

2012-01-01 00:00:01 [some_command] => some command output...
2012-01-01 00:01:01 [other_command] => other command output...

进程应该同时运行并写入文件。

William Pursell指出的最终解决方案是:

some_command 2>&1 | perl -ne '$|=1; print localtime . ": [somme_command] $_"' >> /log.log &

我还添加了2>&1来将STDOUTSTDERR重定向到文件,并将&重定向到最后,以使程序保持在后台。

谢谢!

5 个答案:

答案 0 :(得分:2)

使用sed的替代解决方案是:

some_command 2>&1 | sed "s/^/`date '+%Y-%m-%d %H:%M:%S'`: [some_command] /" >> log.log &

它通过替换行“character”(^)的开头来工作。如果你不想依赖Perl,可能会派上用场。

答案 1 :(得分:1)

类似的东西:

(echo -n $(date); echo  -n " ls => ";  ls) >> /tmp/log

但是,您的命令输出是多行,并且它不会显示您正在显示的上述格式。在这种情况下,您可能希望使用tr或sed等命令替换输出中的换行符。

答案 2 :(得分:1)

鉴于您的意见,您似乎希望多个进程同时写入文件,并在每个单独的行上都有一个时间戳。这样的事情就足够了:

some_cmd | perl -ne '$|=1; print localtime . ": [some_cmd] $_"' >> logfile

如果您想按摩日期格式,请使用POSIX :: strftime

some_cmd | perl -MPOSIX -ne 'BEGIN{ $|=1 }
   print strftime( "%Y-%m-%d %H:%M:%S", localtime ) . " [some_cmd] $_"' >> logfile

答案 3 :(得分:1)

在Ubuntu上:

sudo apt-get install moreutils
echo "cat" | ts
Mar 26 09:43:00 cat

答案 4 :(得分:0)

一种方法是use logger(1).

另一个可能是这样的:

stamp () {
  ( echo -n "`date +%T` "
    "$@" ) >> logfile
}

stamp echo how now brown cow
相关问题