在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函数中以方便使用。不确定这是否会使它变得更复杂。
答案 0 :(得分:1)
如果你拥有它或者可以获得它,xargs
命令从其标准输入收集命令的参数,然后运行指定的命令。您可以将其与rg
函数组合以过滤函数的输出。例如,
rg Word1 | xargs grep -il Word2
参数xargs
从其标准输入读取 - 函数rg
发出的文件名 - 将附加到给定命令(grep -il Word2
),并生成的命令运行。如果xargs
的输入足够长,那么参数将被分割为grep命令的多次调用,这对输出没有影响(在这种情况下),但是由于参数太多而避免命令执行失败
还要考虑以相同的方式构造函数rg
(即使用xargs
)以最小化执行的单独grep
进程的数量。开始新流程是您可以做的更昂贵的事情之一。