Shell

當別名為“grep -R”時,grep 忽略管道

  • November 12, 2019

我正在嘗試將 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'

還有什麼我可能會失去的嗎?

別名是導致它的原因。從man grep,該-R選項導致grep“遞歸讀取每個目錄下的所有文件”。因此,管道之後的部分忽略了第一個的輸出grep,而是grep從目前目錄遞歸地遍歷所有文件。

您可以繞過別名並將 vanilla grep 與\grep. 因此,以下內容應該可以滿足您的期望。

grep lcov * | \grep -v call

但是,我個人認為-R輸入別名是令人困惑的。

有趣的。這似乎是正確的,看起來像魔鬼在細節中。

grep "search_query" *

可能不同於

grep search_query *

可能

grep 'search_query' *

試試這個:

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

該文件是否/tmp/foo包含您想要的內容?給出你想要的答案嗎

? 替換為unalias 它,看看它是否有效。 grep -v but_not_this
grep``\grep

引用自:https://unix.stackexchange.com/questions/500725