搜索文件中的多个模式,如果模式匹配则删除行

时间:2012-10-06 14:17:48

标签: shell unix scripting sed awk

例如,文件包含内容:

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,如果模式匹配,则删除行。

我也希望在单一命令中执行此操作。

5 个答案:

答案 0 :(得分:6)

另一种解决方案:

 awk '!/10.45.56.84|10.81.51.92/' file

答案 1 :(得分:4)

grep -Fv -f <(echo $'10.45.56.84\n10.81.51.92') filename

答案 2 :(得分:3)

你可以这样做:

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运算符。

在这两种情况下,我们将句点放在括号之间,否则句点将用作匹配任何字符的运算符。您可以在一对括号中放置更多字符,它们将被解释为匹配指定的一个字符。

希望这有助于=)

答案 3 :(得分:2)

这可能适合你(GNU sed):

sed -r '/10\.(45\.56\.84|81\.51\.92)/d' file

答案 4 :(得分:-1)

awk -F&#34; &#34; &#39; {if($ 1!=&#34; 10.45.56.84&#34;)if($ 1!=&#34; 10.81.51.92&#34;){print $ 0;}}&#39; inputFile&gt; OUTPUTFILE

解释: awk:awk是一种脚本语言,用于处理数据和生成报告。

&#34; &#34; :它用于分隔符。如果数据由|分隔然后需要提及像&#34; |&#34;

{if($ 1!=&#34; 10.45.56.84&#34;)if($ 1!=&#34; 10.81.51.92&#34;){print $ 0;}}&#39; :pattern(条件)并在outputFile中打印