Shell 在文件中搜索多个图案,如果图案匹配,则删除行

Shell 在文件中搜索多个图案,如果图案匹配,则删除行,shell,unix,scripting,sed,awk,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.84和10.81.51.92,如果模式匹配,则删除行 我还想用一个命令来完成这项工作 您可以这样做: sed -e '/10[.]45[.]56[.]84/d;/10[.]81[.]51[.]92/d' file 这有两个sed“d”d

例如,文件包含以下内容:

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

我还想用一个命令来完成这项工作

您可以这样做:

sed -e '/10[.]45[.]56[.]84/d;/10[.]81[.]51[.]92/d' file
这有两个sed“d”delete命令,用分号分隔。但是,只有当它们与每个命令前面的斜杠之间包含的各自模式相匹配时,才会执行它们

您也可以使用grep:

grep -Ev '10[.]45[.]56[.]84|10[.]81[.]51[.]92' file
“-v”标志告诉grep只打印与模式不匹配的行,我们使用OR运算符“|”匹配任一模式。使用“-E”标志,因此我们不必用反斜杠转义OR运算符

在这两种情况下,我们都将句点放在括号之间,因为在其他情况下,句点用作匹配任何字符的运算符。您可以在一对括号内放置更多字符,这些字符将被解释为与指定的字符之一匹配

希望这有助于=)

另一种解决方案:

 awk '!/10.45.56.84|10.81.51.92/' file
这可能适用于您(GNU-sed):

grep-Fv-fawk-f”“{if($1!=“10.45.56.84”)if($1!=“10.81.51.92”){print$0;}}}inputFile>OutputFile

说明: awk:awk是一种用于操作数据和生成报告的脚本语言

“”:其用于分隔符。如果数据之间用|分隔,那么需要提到像“|”


{if($1!=“10.45.56.84”)if($1!=“10.81.51.92”){print$0;}}:模式(条件)和在输出文件中打印欢迎使用堆栈溢出!我们鼓励你这样做。如果您有,请将其添加到问题中-如果没有,请先研究并尝试您的问题,然后返回。在
sed
命令中,如果第一个比较成功,则无需执行第二个比较。它可以工作(并且+1),但是您可以使用
b
指令开始下一个循环:
sed-e'/10[.]45[.]56[.]84/{d;b}/10[.]81[.]51[.]92/d'
实际上,“d”命令开始下一个循环。这也是可能出现意外行为的原因。“D”命令的行为方式相同,但最多只删除第一个换行符,重新启动循环,但仅在模式空间变为空时加载下一行。很多时候,我不得不做's/[^\n]*/',只是为了模仿“D”命令,但没有开始下一个循环。谢谢你的反馈!这也将删除以下行:
10145x56y84
。对于给定的输入可能可以接受,但是
awk'/10\.45\.56\.84 | 10\.81\.51\.92/'
会更准确。感谢您不必逃避一切!虽然这个代码片段可以解决这个问题,但它确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
sed -r '/10\.(45\.56\.84|81\.51\.92)/d' file
grep -Fv -f <(echo $'10.45.56.84\n10.81.51.92') filename