2017-02-27 49 views
0

我想在我的命令输出的每一个新行中添加一个前缀。在bash命令输出中添加前缀

我想这样做,因为我将在parralel中运行多个命令,这将在相同的输出日志中记录。

我试着用AWK做到这一点没有成功

runcommand1 | "[prefix1]" + log > logfile & 
runcommand2 | "[prefix2]" + log > logfile & 

结果日志将

[prefix1] bla bla 
[prefix2] blo blo blo 
[prefix1] other bla 
[prefix1] other bla 
[prefix2] other blo blo 
+1

这是不同的程序试图同时写一个常规文件吗?我认为你应该序列化日志记录任务,以便不可能产生破坏输出。也许为不同的进程使用不同的日志文件。请参阅http://stackoverflow.com/questions/15384331/unix-can-i-write-to-the-same-file-in-parallel-without-missing-entries –

回答

2

我想在我的命令输出的每个新行添加一个前缀。

runcommand1 | "[prefix1]" + log > logfile & 
runcommand2 | "[prefix2]" + log > logfile & 
           ^
    Second one will overwrite first opened logfile 
    you have to append ">>" second one 

下文提到的几个命令可以帮助你。

您可以使用sed

yourcommand1 | sed 's/^/[prefix1] /' > logfile & 

您可以使用awk

yourcommand1 | awk '{ print "[prefix1]", $0 }' > logfile & 
yourcommand2 | awk '{ print "[prefix2]", $0 }' >> logfile & 

,如果你想传递的前缀字符串在awk然后

yourcommand1 | awk -v prefix="[prefix1]" '{ print prefix, $0 }' > logfile & 
yourcommand2 | awk -v prefix="[prefix2]" '{ print prefix, $0 }' >> logfile & 

mystring1="[prefix1]" 
mystring2="[prefix2]" 
yourcommand1 | awk -v prefix="$my_string1" '{ print prefix, $0 }' > logfile & 
yourcommand2 | awk -v prefix="$my_string2" '{ print prefix, $0 }' >> logfile & 

如果这不是你所需要的,然后更新您的问题表现出一些更多的真正具有代表性的样品输入(你运行runco​​mmand1/runco​​mmand2后接收)和预期产出。

+1

可能值得一提的是io缓冲和'stdbuf '命令。 – hek2mgl

+0

@ hek2mgl:是的,大部分时间我们必须假设输入可能是这样:) –

+1

两个不同的管道写入同一个日志文件?第二个“开放”不会覆盖第一个“开放”已经写入的内容吗?这看起来像是一种竞争条件。 – Jens