如何通过grep -P匹配以@开头且含独立'A'的DNS区域文件行
DNS区域文件目标行匹配方案
需求与现有问题
要从DNS区域文件里挑出同时符合以下要求的行:
- 行必须以
@开头 - 行里包含独立的
A字符——也就是A不能是SOA、CNAME这类字符串的一部分
之前用grep -P尝试时遇到的问题:
grep -P "(^|\s)\K@(?=\s|$)" myzonefile.com:能找到带@的行,但筛不掉没有独立A的行grep -P '(?=.*@)(?=.*A)' myzonefile.com:会误把带SOA的行也匹配进来grep -E '\b[A]\s' myzonefile.com:能识别独立A,但没法同时要求行以@开头,而且不想用grep | grep这种管道组合
另外想知道:用sed或awk来做会不会更合适?
单grep -P命令解决
直接把两个条件整合到一个正则里就行,用单词边界\b来锁定独立的A,配合行首匹配:
grep -P '^@.*\bA\b' myzonefile.com
正则拆解:
^@:强制要求行的第一个字符就是@.*:匹配@到独立A之间的任意内容(不管中间有多少字符)\bA\b:\b是单词边界,只有当A前后是空格、行尾这类非单词字符时才会匹配,完美避开SOA里的A
要是想更严谨,确保A后面要么是空格要么是行尾(符合DNS记录的格式),可以改成:
grep -P '^@.*\bA(?=\s|$)' myzonefile.com
sed/awk的选择
如果只是单纯找符合条件的行,grep -P已经足够简单高效。但如果之后还要对这些行做修改、提取字段之类的操作,sed或awk会更灵活:
sed实现
sed -n '/^@.*\bA\b/p' myzonefile.com
-n:默认不输出所有行,只打印匹配到的/^@.*\bA\b/p:匹配符合条件的行并打印
awk实现
awk '/^@/ && /\bA\b/' myzonefile.com
- 逻辑很直观:先找以
@开头的行,再筛选其中带独立A的,满足两个条件就输出该行(awk默认输出匹配行)
内容的提问来源于stack exchange,提问作者humbleStrength
相关产品推荐
相关产品推荐

