如何從文件中尋找「包含」和「排除另一個術語」?

如何從文件中尋找「包含」和「排除另一個術語」?

我正在嘗試建立一個必須包含該術語並排除另一個術語的 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

筆記:另一個答案應該有效,但它什麼也解釋不了;因此我的解釋性答案。

你告訴第二個grepfile.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"

後一種語法至少有一個優點,在最後進行了解釋這是我的另一個答案

相關內容