如何将stdout中的值作为下一个命令的参数传递

时间:2015-01-30 12:07:00

标签: bash shell awk grep pipe

我想责备包含“todo | fixme”的代码行 我有脚本的一般流程,但很难将它组合成一个

找到带有“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提取的值传递到第二个命令。

我错过了将这些命令组合成一个“脚本”的粘合剂( - :

1 个答案:

答案 0 :(得分:2)

您可以使用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}"

替换varibales。当您执行上述命令时,它们仅打印到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

小通知:我想你想在第一个命令中打印行号extracterd,不是吗?但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