2012-10-06 73 views
1

對於前一個文件包含的內容:搜索多個模式和刪除行,如果模式匹配

10.45.56.84 raj 
10.49.31.81 mum 
10.49.31.86 mum 
10.81.51.92 guj 
10.45.56.116 raj 
10.45.56.84 raj 

我要搜索10.45.56.8410.81.51.92在上述文件並刪除行,如果模式匹配。

另外我想單一命令做到這一點。

+2

歡迎堆棧溢出!我們鼓勵你[研究你的問題](http://stackoverflow.com/questions/how-to-ask)。如果你已經[嘗試了某些東西](http://whathaveyoutried.com/),請將其添加到問題中 - 如果沒有,請先研究並嘗試您的問題,然後再回來。 – 2012-10-06 14:20:18

回答

6

另一種解決方案:

awk '!/10.45.56.84|10.81.51.92/' file 
+0

非常感謝您的快速響應 –

+2

這也將刪除行:'10145x56y84'。對於給定的輸入可能可以接受,但'awk'!/ 10 \ .45 \ .56 \ .84 | 10 \ .81 \ .51 \ .92 /''會更準確。 –

2

你可以這樣做:

sed -e '/10[.]45[.]56[.]84/d;/10[.]81[.]51[.]92/d' file 

這有兩個sed的 「d」 刪除用分號隔開的命令。但是,只有匹配每個命令之前斜槓之間的相應模式纔會執行它們。

您還可以使用grep:

grep -Ev '10[.]45[.]56[.]84|10[.]81[.]51[.]92' file 

的「-v」標誌告訴grep來只打印不匹配的模式的線,我們使用OR運算符「|」以匹配任何一種模式。使用「-E」標誌,所以我們不必用反斜槓來轉義OR運算符。

在這兩種情況下,我們都放置括號之間的時間段,因爲否則該句點將用作匹配任何字符的運算符。您可以在一對括號內放置更多字符,並且它們將被解釋爲匹配指定的一個字符。

希望這有助於=)

+0

在'sed'命令中,如果第一個成功,則不需要執行第二次比較。它可以工作(並且** + 1 **),但是您可以使用'b'指令開始下一個循環:'sed -e'/10[.]45[.]56[.]84/ {d; b};/10 [。] 81 [。] 51 [。] 92/d'' – Birei

+0

「d」命令實際上開始下一個週期。這也是可能有意想不到的行爲。 「D」命令的行爲方式相同,但只刪除第一個換行符,重新啓動循環,但只在模式空間變空時加載下一行。很多時候我不得不做'/ [^ \ n] * //'只是爲了模仿「D」命令,但是沒有開始下一個週期。感謝您的反饋! –

+0

你說得對。對我而言,這是多大的錯誤!抱歉。 – Birei

1

這可能爲你工作(GNU SED):

sed -r '/10\.(45\.56\.84|81\.51\.92)/d' file 
3
grep -Fv -f <(echo $'10.45.56.84\n10.81.51.92') filename 
+0

感謝您不必逃避一切! – TCB13

-1

的awk -F 「」「{ if($ 1!=「10.45.56.84」)if($ 1!=「10.81.51.92」){print $ 0;}}'inputFile> OutputFile

說明: awk:Awk是一種用於處理數據和生成報告的腳本語言。

「」:它用於分隔符。如果數據由|分隔那麼需要提到像「|」

{如果($ 1 = 「10.45.56.84」!)如果($ 1 = 「10.81.51.92」!){打印$ 0;}}」:模式(條件),並在打印OUTPUTFILE

+0

雖然此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要使用解釋性註釋來擠佔代碼,因爲這會降低代碼和解釋的可讀性! – FrankerZ