grep中方括号内的组字符

时间:2015-05-25 07:55:09

标签: regex grep

我有一个名为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-USc5-Ny-Msi-USr6-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-USc5-L123-Ny-Msi-USr6-L123-Ms-Msi-UK。是否可以将方括号内的字符分组?我的意思是grep -Po "^[^ \t'L123']+Msi[^ \t]+" zone-file?看起来这是不可能的?

2 个答案:

答案 0 :(得分:1)

对于您的示例,这将完成工作:

grep CNAME zone-file | cut -d' ' -f1

答案 1 :(得分:1)

grep -oP '\S+Msi\S*(?=.*CNAME)'

这在GNU grep中使用Perl兼容的regex引擎。它找到一个包含字符串Msi的“单词”,其中CNAME稍后出现在同一行中。 -o选项将输出限制为仅匹配的文本。