grep 在别名为“grep -R”时忽略管道

grep 在别名为“grep -R”时忽略管道

我正在尝试将 grep 搜索的输出通过管道传输到另一个 grep 的输入中。例如:

grep search_query * | grep -v but_not_this

但第二个 grep 没有使用前一个搜索的输出。看起来第二个 grep 只是使用 * 代替。例如,

grep lcov *                                                                                          
tst/bits/Module.mk:21:$(call func_report_lcov)
tst/drivers/Module.mk:27:$(call func_report_lcov)

但是当我想过滤掉包含“call”的结果时,

grep lcov * | grep -v call
...

Grep 给我我工作区中的每一行不包含“呼叫”。

环境信息:

  • 这在 bash 和 Fish 中都会发生
  • 我已经为 grep 命令设置了别名,如下所示alias grep='grep -nR --color=always'

我可能还缺少什么吗?

答案1

别名是造成这种情况的原因。从man grep,该-R选项导致grep“递归地读取每个目录下的所有文件”。因此,管道之后的部分会忽略第一个的输出grep,而是grep从当前目录递归地遍历所有文件。

您可以绕过别名并使用 vanilla grep 和\grep.因此,以下内容应该会满足您的期望。

grep lcov * | \grep -v call

然而,我个人认为输入-R别名是令人困惑的。

答案2

有趣的。这出现正确地说,细节看起来就像是魔鬼。

grep "search_query" *

可能不同于

grep search_query *

哪个可能又不同于

grep 'search_query' *

尝试这个:

grep search_query * > /tmp/foo
grep -v but_not_this /tmp/foo

该文件/tmp/foo包含您想要的内容吗?
是否grep -v but_not_this给出了你想要的答案?
替换grep\grep以取消别名,看看是否有效。

相关内容