在bashrc函数的输出上使用-exec

时间:2017-03-10 14:54:42

标签: bash grep find cygwin exec

在Cygwin中,我写了一个bashrc函数rg,它基本上是一个递归的grep语句:

rg () {
    find . -type f -exec grep -il $1 {} \;
}

这很好用,但现在我需要在每个输出行上运行一个额外的grep来检查另一个单词。我基本上希望它列出包含两个单词的每个文件(不一定在同一行)。我试过这个命令:

rg Word1 -exec grep -il Word2 {} \;

这似乎只输出包含“Word1”的相同文件。

我尝试了下一个命令,我认为它只是在每一行输出“Ha”,但它仍然会继续列出“rg Word1”语句中的文件。

rg Word1 -exec echo "Ha" \;

所以我在这里做错了。任何人都可以清除我的困惑吗?我知道有一种方法可以在grep本身中执行此操作,但这似乎可以在每行的基础上工作。我猜我正在做的事情很常见。一旦我开始工作,我想把它放在另一个bashrc函数中以方便使用。不确定这是否会使它变得更复杂。

1 个答案:

答案 0 :(得分:1)

如果你拥有它或者可以获得它,xargs命令从其标准输入收集命令的参数,然后运行指定的命令。您可以将其与rg函数组合以过滤函数的输出。例如,

rg Word1 | xargs grep -il Word2

参数xargs从其标准输入读取 - 函数rg发出的文件名 - 将附加到给定命令(grep -il Word2),并生成的命令运行。如果xargs的输入足够长,那么参数将被分割为grep命令的多次调用,这对输出没有影响(在这种情况下),但是由于参数太多而避免命令执行失败

还要考虑以相同的方式构造函数rg(即使用xargs)以最小化执行的单独grep进程的数量。开始新流程是您可以做的更昂贵的事情之一。