在 grep 中将方括号内的字符分组
group characters within square brackets in 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
我想 grep 出 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
我想用尽可能松散的正则表达式来完成这个,这意味着搜索除 space 之外的任何字符或 tab 直到字符串 Msi
然后再搜索一个或多个字符,除了 space 或制表符。所以 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
?貌似这样不行?
对于您的示例,这将完成工作:
grep CNAME zone-file | cut -d' ' -f1
grep -oP '\S+Msi\S*(?=.*CNAME)'
这在 GNU grep 中使用了与 Perl 兼容的正则表达式引擎。它找到一个包含字符串 Msi 的 "word",其中 CNAME 稍后出现在同一行中。 -o
选项将输出限制为仅匹配的文本。
我有一个名为 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
我想 grep 出 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
我想用尽可能松散的正则表达式来完成这个,这意味着搜索除 space 之外的任何字符或 tab 直到字符串 Msi
然后再搜索一个或多个字符,除了 space 或制表符。所以 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
?貌似这样不行?
对于您的示例,这将完成工作:
grep CNAME zone-file | cut -d' ' -f1
grep -oP '\S+Msi\S*(?=.*CNAME)'
这在 GNU grep 中使用了与 Perl 兼容的正则表达式引擎。它找到一个包含字符串 Msi 的 "word",其中 CNAME 稍后出现在同一行中。 -o
选项将输出限制为仅匹配的文本。