You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过grep -P匹配以@开头且含独立'A'的DNS区域文件行

DNS区域文件目标行匹配方案

需求与现有问题

要从DNS区域文件里挑出同时符合以下要求的行:

  1. 行必须以@开头
  2. 行里包含独立的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:36:59