如何匹配已知模式后出现的模式

时间:2012-09-17 19:16:26

标签: regex awk match

考虑绑定dns区域文件的格式:

zone "mydomain.com" {
    type slave;
    file "db.mydomain";
    masters {
            192.168.5.15;
    };
};

...

对conf文件中的其他区域重复几次。

我需要在脚本中发现有关zone.conf文件的一些详细信息。

我知道我正在寻找的域名,因此我可以使用“^ zone”mydomain.com“'

等正则表达式

但我需要发现在我正在查看的区域名称之后首先出现的文件行。

我还想在主列表中找到ip地址。

我们的配置只有一个主IP,所以我不必担心多个ip。

赞赏的想法。

3 个答案:

答案 0 :(得分:1)

sed可用于隔离dns文件的右侧部分,然后在模式匹配后打印下一行:

# sed -n '/"mydomain.com"/,/^};$/{/^zone "mydomain.com"/{n;p}}' dnsfile
   type slave;
# sed -n '/"mydomain.com"/,/^};$/{/masters/{n;p}}' dnsfile
        192.168.5.15;

答案 1 :(得分:0)

这里的一种方法是使用sed首先输出你感兴趣的区域块,然后只获取你想要的线条。这可能类似于以下内容:

sed -n '/^zone "mydomain.com"/,/^};/p' zone.conf | sed -n -e '2p' -e '/[0-9]/p'

2p将仅打印第二行(区域名称后面的第一行),/[0-9]/p将仅打印包含数字(ip地址)的行。

答案 2 :(得分:0)

要获得修剪IP的下一行:

awk -F';' '/^ *masters/ { getline; sub(/^ */, "", $1); print $0 }' file

输出

192.168.5.15

获取区域线:

awk -F';' '/^zone "mydomain.com"/ { getline; sub(/^ */, "", $1); print $0}' file

输出

192.168.5.15