【问题标题】:search multiple pattern in file and delete line if pattern matches在文件中搜索多个模式并在模式匹配时删除行
【发布时间】:2012-09-27 10:56:42
【问题描述】:

例如,文件包含内容:

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

我也想在单个命令中执行此操作。

【问题讨论】:

标签: shell unix scripting sed awk


【解决方案1】:

awk -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;}}' : 模式(条件)并在 outputFile 中打印

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
【解决方案2】:
grep -Fv -f <(echo $'10.45.56.84\n10.81.51.92') filename

【讨论】:

  • 感谢您不必逃避一切!
【解决方案3】:

这可能对你有用(GNU sed):

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

【讨论】:

    【解决方案4】:

    另一种解决方案:

     awk '!/10.45.56.84|10.81.51.92/' file
    

    【讨论】:

    • 这也将删除行:10145x56y84。对于给定的输入可能可以接受,但awk '!/10\.45\.56\.84|10\.81\.51\.92/' 会更准确。
    【解决方案5】:

    你可以这样做:

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

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

    希望这有帮助 =)

    【讨论】:

    • 在sed 命令中,如果第一个比较成功,则不需要执行第二个比较。它可以工作(并且 +1 为此)但您可以使用 b 指令开始下一个循环:sed -e '/10[.]45[.]56[.]84/ { d; b }; /10[.]81[.]51[.]92/d'
    • “d”命令实际上开始了下一个循环。这也是可能有意外行为的东西。 “D”命令的行为方式相同,但仅删除第一个换行符,重新开始循环,但仅在模式空间变空时才加载下一行。很多时候我不得不做 's/[^\n]*//' 只是为了模仿“D”命令,但没有开始下一个循环。不过感谢您的反馈!
    猜你喜欢
    • 2021-10-15
    • 2013-04-03
    • 2012-01-27
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多