Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在bash命令输出中添加前缀_Bash_Logging_Awk - Fatal编程技术网

在bash命令输出中添加前缀

在bash命令输出中添加前缀,bash,logging,awk,Bash,Logging,Awk,我想在命令输出的每一行中添加前缀 runcommand1 | "[prefix1]" + log > logfile & runcommand2 | "[prefix2]" + log > logfile & ^ Second one will overwrite first opened logfile you have to append ">>" second one

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

runcommand1 | "[prefix1]" + log > logfile &
runcommand2 | "[prefix2]" + log > logfile &
                                ^
    Second one will overwrite first opened logfile
    you have to append ">>" second one  
我之所以想这样做,是因为我将在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
我想在命令输出的每一行中添加前缀

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 &
yourcommand1 | awk '{ print "[prefix1]", $0 }' > logfile &
yourcommand2 | awk '{ print "[prefix2]", $0 }' >> logfile &
您可以使用
awk

yourcommand1 | sed  's/^/[prefix1] /' > logfile &
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 &

如果这还不是您所需要的全部,那么更新您的问题,以显示一些更具代表性的示例输入(您在运行runcommand1/runcommand2之后收到的)和预期输出

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

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 &
yourcommand1 | awk '{ print "[prefix1]", $0 }' > logfile &
yourcommand2 | awk '{ print "[prefix2]", $0 }' >> logfile &
您可以使用
awk

yourcommand1 | sed  's/^/[prefix1] /' > logfile &
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 &


如果这还不是您所需要的全部,则更新您的问题,以显示一些更具代表性的示例输入(您在运行runcommand1/runcommand2后收到的)和预期输出。

为每行输出预先添加前缀(或附加后缀)的最简单方法是通过
printf

runcommand1 | xargs printf-n1'[前缀]%s\n'>日志文件&
如果希望在前缀后打印空格,则这可以进一步简化:

runcommand1 | xargs echo-n1'[前缀]'>日志文件&

请注意,
-n1
需要逐行实时流输出,而不是缓冲所有行。

为每行输出预先添加前缀(或附加后缀)的最简单方法是通过
printf

runcommand1 | xargs printf-n1'[前缀]%s\n'>日志文件&
如果希望在前缀后打印空格,则这可以进一步简化:

runcommand1 | xargs echo-n1'[前缀]'>日志文件&

请注意,
-n1
需要逐行实时流输出,而不是缓冲所有行。

这是不同的程序试图同时写入一个常规文件吗?我认为您应该序列化日志记录任务,这样就不可能导致输出中断。可能对不同的进程使用不同的日志文件。看,这是不同的程序试图同时写入一个常规文件吗?我认为您应该序列化日志记录任务,这样就不可能导致输出中断。可能对不同的进程使用不同的日志文件。请参阅可能值得一提的io缓冲和stdbuf命令。@hek2mgl:是的,大多数情况下,我们必须假设输入可能是这样的:)两个不同的管道写入同一个日志文件?第二个“打开”不会覆盖第一个“打开”已经写的内容吗?对我来说,这看起来像是一个竞争条件。@jens是真的,我至少附加了第二个条件以使答案有意义,不知道用户想要什么do@AkshayHegde我将运行两个Docker容器并连接它们的输出可能值得一提的是io缓冲和
stdbuf
命令。@hek2mgl:是的,大多数情况下,我们必须假设输入可能是这样的:)两个不同的管道写入同一个日志文件?第二个“打开”不会覆盖第一个“打开”已经写的内容吗?对我来说,这看起来像是一个竞争条件。@jens是真的,我至少附加了第二个条件以使答案有意义,不知道用户想要什么do@AkshayHegde我将运行两个Docker容器并对其输出进行concat