我正在嘗試建立一個必須包含該術語並排除另一個術語的 grep 搜尋。我嘗試使用多個 -E“模式”選項,但這沒有用。
這是我嘗試過的命令的範例。
grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154" file.csv
但輸出結果僅符合第二個約束 grep -Eiv "10.10.210.154"
答案1
假設你要找\,17\:31
但不是從IP10\.10\.210\.154
你可以用這個。
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
答案2
筆記:另一個答案應該有效,但它什麼也解釋不了;因此我的解釋性答案。
你告訴第二個grep
讀file.csv
,所以它就讀了。它忽略其標準輸入,因為這是grep
它對文件進行操作時所做的事情。
實際上,第二個grep
行為就好像第一個不存在一樣。它在處理文件並列印其輸出(如果有)後退出。
第一個grep
等待輸入(如果在互動式 shell 中運行,通常來自鍵盤)。它可以佔用許多行,甚至將許多(匹配的)行列印到其標準輸出,直到管道緩衝區決定將輸出傳遞給第二個grep
。然後,如果第二個grep
不再存在,grep
則通知第一個管道損壞;它退出了。
或者您可以按Ctrl+D表示輸入結束;或者你可以按Ctrl+C殺死第一個grep
(還有第二個,如果它還活著)。但這不會修復您的資料流。
正確的資料流是這樣的:您需要第一個grep
讀取文件,然後將結果透過管道傳遞給第二個:
grep -Ei "\,17\:31" file.csv | grep -Eiv "10\.10\.210\.154"
# or
<file.csv grep -Ei "\,17\:31" | grep -Eiv "10\.10\.210\.154"
後一種語法至少有一個優點,在最後進行了解釋這是我的另一個答案。