如何将标准输出的值作为下一个命令的参数传递。

4
我想要查看包含“todo | fixme”的代码行的 SVN blame。我已经有了脚本的基本流程,但是无法将其合并为一个完整的脚本。
找到包含“todo”的行。
grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" .

责备那一行代码。
svn blame ${file} | cat -n |grep ${linenumber}

我可以用awk从第一个命令中获取$file和$linenumber,但我不知道如何将我用awk提取的值传递到第二个命令。我缺少将这些命令组合成一个“脚本”的粘合剂(- :

2
你尝试过xargs吗?http://en.wikipedia.org/wiki/Xargs - Jaimie Whiteside
@JaimieWhiteside 我会看一下 Xargs,谢谢! - braunbaer
@JaimieWhiteside 我的理解是 xargs 不会有所帮助,因为我需要在几个后续管道中使用行号值,也许我漏掉了什么? - braunbaer
1个回答

3
你可以使用 awk 命令构建命令,并将其通过管道传递给 bash:
grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" . |\
awk -F: '{printf "svn blame \"%s\" | cat -n | grep \"%s\"\n", $1, $2}'

这将按照以下格式打印每行输入的一个命令:

svn blame "${file}" | cat -n | grep "${linenumber}"

变量被替换。当您按照上述命令执行时,它们仅会在shell中打印出来,这样您可以确认一切是否正确。如果是,请在命令的输入端添加最后一个管道符,将输出重定向到bash。完整命令如下:

grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" . |\
awk -F: '{printf "svn blame \"%s\" | cat -n | grep \"%s\"\n", $1, $2}' | bash

一个小提示:我想你想要打印第一个命令中提取的行号,是吗?但是grep ${linenumber}只会给出包含字符串${linenumber}的行而已。要仅打印行号,请使用该命令:sed -n "2p",例如打印第2行。完整的命令应该像这样:

grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" . |\
awk -F: '{printf "svn blame \"%s\" | cat -n | sed -n \"%sp\"\n", $1, $2}' | bash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接