我有一个名为zone-file
的文件,内容如下:
c3-Tx-Msi-US IN CNAME c3-L123-Tx-Msi-US
c3-L123-Tx-Msi-US IN A 192.0.2.11
c5-Ny-Msi-US IN CNAME c5-L123-Ny-Msi-US
c5-L123-Ny-Msi-US IN A 192.0.2.33
c1-Ny-Gre-SE IN CNAME c1-L123-Ny-Gre-SE
c1-L123-Ny-Gre-SE IN A 192.0.2.89
r6-Ms-Msi-UK IN CNAME r6-L123-Ms-Msi-UK
r6-L123-Ms-Msi-UK IN A 192.0.2.16
c1-St-Rec-SE IN CNAME c1-L123-St-Rec-SE
c1-L123-St-Rec-SE IN A 192.0.2.1
我想要c3-Tx-Msi-US
,c5-Ny-Msi-US
和r6-Ms-Msi-UK
。这意味着正则表达式必须包含此Msi
字符串,并且grep命令的输出应该如下:
c3-Tx-Msi-US
c5-Ny-Msi-US
r6-Ms-Msi-UK
我想用尽可能宽松的正则表达式完成此操作,这意味着搜索除空格或制表符以外的任何字符到字符串Msi
,然后再搜索除空格或制表符之外的一个或多个字符。因此grep -Po "^[^ \t]+Msi[^ \t]+" zone-file
会很完美,但这也包括c3-L123-Tx-Msi-US
,c5-L123-Ny-Msi-US
和r6-L123-Ms-Msi-UK
。是否可以将方括号内的字符分组?我的意思是grep -Po "^[^ \t'L123']+Msi[^ \t]+" zone-file
?看起来这是不可能的?
答案 0 :(得分:1)
对于您的示例,这将完成工作:
grep CNAME zone-file | cut -d' ' -f1
答案 1 :(得分:1)
grep -oP '\S+Msi\S*(?=.*CNAME)'
这在GNU grep中使用Perl兼容的regex引擎。它找到一个包含字符串Msi的“单词”,其中CNAME稍后出现在同一行中。 -o
选项将输出限制为仅匹配的文本。