我正在尝试将 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
以取消别名,看看是否有效。