Bash 使用管道输出的每一行作为脚本的参数
我有一个应用程序(myapp),它提供多行输出 结果:Bash 使用管道输出的每一行作为脚本的参数,bash,grep,pipeline,Bash,Grep,Pipeline,我有一个应用程序(myapp),它提供多行输出 结果: abc|myparam1|def ghi|myparam2|jkl mno|myparam3|pqr stu|myparam4|vwx 使用grep和sed,我可以获得如下参数 myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//' 但是,我们希望这些myparamx值作为脚本的参数为每个参数执行 myscript.sh myparam1 myscript.sh myp
abc|myparam1|def
ghi|myparam2|jkl
mno|myparam3|pqr
stu|myparam4|vwx
使用grep和sed,我可以获得如下参数
myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//'
但是,我们希望这些myparamx值作为脚本的参数为每个参数执行
myscript.sh myparam1
myscript.sh myparam2
etc.
非常感谢您的帮助请参见
xargs
。例如:
myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//' | xargs -n 1 myscript.sh
请参见
xargs
。例如:
myapp | grep '|' | sed -e 's/^[^|]*//' | sed -e 's/|.*//' | xargs -n 1 myscript.sh
也许这有助于-
myapp | awk -F"|" '{ print $2 }' | while read -r line; do /path/to/script/ "$line"; done
也许这有助于-
myapp | awk -F"|" '{ print $2 }' | while read -r line; do /path/to/script/ "$line"; done
我喜欢黑暗猎鹰的
xargs-n1
解决方案,而while read
是这类事情的经典工具,但只是为了完整性:
myapp | awk -F'|' '{print "myscript.sh", $2}' | bash
作为旁注,关于第二个字段的提取,您可以使用cut
:
myapp | cut -d'|' -f 1 # -f 1 => second field, starting from 0
我喜欢黑暗猎鹰的
xargs-n1
解决方案,而while read
是这类事情的经典工具,但只是为了完整性:
myapp | awk -F'|' '{print "myscript.sh", $2}' | bash
作为旁注,关于第二个字段的提取,您可以使用cut
:
myapp | cut -d'|' -f 1 # -f 1 => second field, starting from 0
Pfff,几乎不可能在这里发布双sed的无用使用
sed-e/^[^ |]*/'| sed-e/|.*/'
可以写成sed-e/^[^ |]*/'-e/.*/'
甚至sed-e/^[^ |]*/';s/|.*/'
是的,但是sed已经很难阅读,所以双sed是为了让阅读更容易。谢谢你,嗯。。。“将空格读作管道符号,不让我张贴”。管道符号有什么问题吗?Pfff,几乎不可能在这里发布双sed的无用用法sed-e/^[^ |]*/'| sed-e/|.*/'
可以写成sed-e/^[^ |]*/'-e/.*/'
甚至sed-e/^[^ |]*/';s/|.*/'
是的,但是sed已经很难阅读,所以双sed是为了让阅读更容易。谢谢你,嗯。。。“将空格读作管道符号,不让我张贴”。管道符号有什么问题吗?刚刚发现xargs确实是一种方式。刚刚发现xargs确实是一种方式。谢谢你的回答,非常有用。只是一个提示,我觉得你应该用一个cut
:cut-f2-d'.
来代替sed
。刚刚发现xargs确实是一条路要走。刚刚发现xargs确实是一条路要走。谢谢您的回答,非常有用。请注意,我觉得您应该用一个cut
来替换sed
:cut-f2-d'