【问题标题】:how to pass values from stdout as parameter for the next command如何将标准输出中的值作为下一个命令的参数传递
【发布时间】:2015-03-29 21:51:01
【问题描述】:

我想 svn blame 包含“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 提取的值通过管道传输到第二个命令中。

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

【问题讨论】:

  • 你试过 xargs 吗? en.wikipedia.org/wiki/Xargs
  • @JaimieWhiteside 我会看看 Xargs thx!
  • @JaimieWhiteside afaik xargs 无济于事,因为我需要几个管道后的 linenumber 值,也许我遗漏了什么?

标签: bash shell awk grep pipe


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-01-30
    • 2014-12-03
    • 2017-08-30
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多