如何用grep结合正则匹配结果并排除含-oob的条目?
问题:如何用grep合并两类匹配结果并排除指定条目?
我想通过grep把两类匹配结果合并成一个输出,同时排除包含"-oob"的条目,请问该用什么正则表达式?
现有两个grep命令的结果:
- 执行
grep "NS" file.txt得到:
ftx.domainname.example.com 3600 IN NS ftxns01.domainname.example.com
- 执行
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"字符串,当然起不到效果。
命令拆解:
grep -E "NS|^sdfns[0-9]" file.txt:-E开启扩展正则,用|同时匹配两类行——包含"NS"的,或者以sdfns加数字开头的。- 管道后面的
grep -v "-oob":-v是反向匹配,把包含"-oob"的行直接过滤掉。
要是想一步到位用单条命令(需要grep支持PCRE语法,大部分Linux发行版都支持),可以这么写:
grep -P "(NS|^sdfns[0-9])(?!.*-oob)" file.txt
这里(?!.*-oob)是负向预查,意思是匹配到前面的条件后,检查后面有没有"-oob",有的话就跳过该行,直接得到你要的结果。
内容的提问来源于stack exchange,提问作者ffsd87
相关产品推荐
相关产品推荐

