You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用grep结合正则匹配结果并排除含-oob的条目?

问题:如何用grep合并两类匹配结果并排除指定条目?

我想通过grep把两类匹配结果合并成一个输出,同时排除包含"-oob"的条目,请问该用什么正则表达式?

现有两个grep命令的结果:

  1. 执行grep "NS" file.txt得到:
ftx.domainname.example.com  3600    IN    NS    ftxns01.domainname.example.com
  1. 执行grep "^sdfns[0-9]" file.txt得到:
ftxns001-oob.domainname.example.com. 86400 IN A    192.168.30.2
ftxns001.domainname.example.com.   86400 IN A    192.168.2.2

期望最终输出:

ftx.domainname.example.com  3600    IN    NS    ftxns01.domainname.example.com
ftxns001.domainname.example.com.   86400 IN A    192.168.2.2

我尝试拼接两次结果,但用grep [^oob]或grep [^-oob]无法排除含"-oob"的主机名。

解决方案

直接用下面的命令就能搞定:

grep -E "NS|^sdfns[0-9]" file.txt | grep -v "-oob"

为啥之前的写法没用?

你用的[^oob]或者[^-oob]是字符类匹配,意思是匹配单个不是o、b(或者不是-、o、b)的字符,根本不是排除整个"-oob"字符串,当然起不到效果。

命令拆解:

  1. grep -E "NS|^sdfns[0-9]" file.txt:-E开启扩展正则,用|同时匹配两类行——包含"NS"的,或者以sdfns加数字开头的。
  2. 管道后面的grep -v "-oob":-v是反向匹配,把包含"-oob"的行直接过滤掉。

要是想一步到位用单条命令(需要grep支持PCRE语法,大部分Linux发行版都支持),可以这么写:

grep -P "(NS|^sdfns[0-9])(?!.*-oob)" file.txt

这里(?!.*-oob)是负向预查,意思是匹配到前面的条件后,检查后面有没有"-oob",有的话就跳过该行,直接得到你要的结果。

内容的提问来源于stack exchange,提问作者ffsd87

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 18:35:40