当别名为'grep -R'时grep忽略管道

bir*_*rdy 3 shell grep pipe alias

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

grep search_query * | grep -v but_not_this
Run Code Online (Sandbox Code Playgroud)

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

grep lcov *                                                                                          
tst/bits/Module.mk:21:$(call func_report_lcov)
tst/drivers/Module.mk:27:$(call func_report_lcov)
Run Code Online (Sandbox Code Playgroud)

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

grep lcov * | grep -v call
...
Run Code Online (Sandbox Code Playgroud)

Grep 给了我工作区中不包含“调用”的每一行

环境信息:

  • 这发生在bash和fish中
  • 我像这样给 grep 命令取了别名 alias grep='grep -nR --color=always'

还有什么我可能会遗漏的吗?

Spa*_*awk 7

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

您可以绕过别名并使用带有\grep. 因此,以下应该给你你所期望的。

grep lcov * | \grep -v call
Run Code Online (Sandbox Code Playgroud)

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

  • 这里的主要问题是 GNU `grep`,当使用 `-R` 并且没有给出文件名操作数时,将递归地作用于当前目录的内容。当使用`-R`并且没有给出文件操作数时,其他`grep`实现不使用`.`作为默认文件操作数(例如,OpenBSD`grep`抱怨`grep:警告:标准输入的递归搜索`)。 (5认同)