Shell
當別名為“grep -R”時,grep 忽略管道
我正在嘗試將 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