在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