Bash:将命令输出和时间戳追加到文件
通常在我的bash脚本中,我习惯于执行Bash:将命令输出和时间戳追加到文件,bash,shell,Bash,Shell,通常在我的bash脚本中,我习惯于执行一些\u命令>>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在我的案例中指出的最终解决方案是:
一些\u命令>>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_命令2>&1 | perl-ne'$|=1;打印本地时间。“:[somme\u命令]$\u'>>/log.log&
我还添加了2>&1
以将STDOUT
和STDERR
重定向到文件,并在末尾添加了一个和,以将程序保留在后台
谢谢大家! 类似这样:
(echo -n $(date); echo -n " ls => "; ls) >> /tmp/log
stamp () {
( echo -n "`date +%T` "
"$@" ) >> logfile
}
stamp echo how now brown cow
但是,您的命令输出是多行的,并且它不会具有上面显示的格式。在这种情况下,您可能希望用诸如tr或sed之类的命令替换输出中的换行符。一种方法是
另一个可能是这样的:
(echo -n $(date); echo -n " ls => "; ls) >> /tmp/log
stamp () {
( echo -n "`date +%T` "
"$@" ) >> logfile
}
stamp echo how now brown cow
根据您的评论,您似乎希望多个进程同时写入文件,并且在每一行上都有一个时间戳。这样的事情可能就足够了:
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
使用sed的替代解决方案是:
some_command 2>&1 | sed "s/^/`date '+%Y-%m-%d %H:%M:%S'`: [some_command] /" >> log.log &
它通过替换行“character”(^)的开头来工作。如果您不想依赖Perl,可能会派上用场。在Ubuntu上:
sudo apt-get install moreutils
echo "cat" | ts
Mar 26 09:43:00 cat
很好用!非常感谢实际上,它只工作了一次,如果我执行第二个命令,它将根本不会执行。提示?:你是在异步运行它吗?(例如,使用和)如何确定它不起作用?可能是缓冲问题,但这应该可以正常工作;打印本地时间。“:[somme_command]$\u'>/log.log 2>&1&
我知道它们不起作用,因为我需要killall
第一个来让第二个来完成它的工作(还有日志记录)。导致该问题的命令是一个python脚本(我可以稍后再处理)。但是有个问题。。。如果我在第二个位置启动dhcpd,它将输出到控制台而不是日志文件。尝试some_command 2>&1|perl…>>log.log&