在 dhcp conf 文件中提取包含范围的行

问题描述

我想提取包含特定子网范围的文件中的行

输入:

subnet 172.16.31.0 netmask 255.255.255.0 {
    # default gateway
    option routers 172.16.31.10;
    option subnet-mask 255.255.255.0;

    option domain-name "aaaaaa";
    option domain-name-servers 172.16.31.10;
    #option nis-domain "domain.org";

    range dynamic-bootp 172.16.31.80 172.16.31.90;
    default-lease-time 21600;
    max-lease-time 43200;

    host test {
        hardware ethernet 00:23:8b:42:3f:d1;
        fixed-address 172.16.31.3;
    }

}
subnet 172.16.31.1 netmask 255.255.255.0 {
    # default gateway
    option routers 172.16.31.11;
    option subnet-mask 255.255.255.0;

    option domain-name "aaaaaa";
    option domain-name-servers 172.16.31.11;
    #option nis-domain "domain.org";

    range dynamic-bootp 172.16.31.80 172.16.31.90;
    default-lease-time 21600;
    max-lease-time 43200;

    host test {
        hardware ethernet 00:23:8b:42:3f:d8;
        fixed-address 172.16.31.4;
    }

}

我想为子网 172.16.31.0 提取范围 dynamic-bootp。

预期输出

range dynamic-bootp 172.16.31.80 172.16.31.90; 

有sed解决方案吗?

更新:内容结构会有所不同,可能会根据配置要求添加/删除

尝试过 -

sed -n '/^subnet 10.172.31.0 netmask/,/^}/{' 
    -n '  s/^\( *range dynamic-bootp\)./,/^}'
    -n '}'
    file

解决方法

使用 GNU sedbash

n="172.16.31.0"
n="${n//./\\.}"  # escape every dot
sed -n '/subnet '"$n"' /,/^}/ {/range/{s/^  *//p}}' file

更新以删除前导空格和/或制表符:

sed -n '/subnet '"$n"' /,/^}/ {/range/{s/^[[:space:]]\+//p}}' file

输出:

range dynamic-bootp 172.16.31.80 172.16.31.90;
,

假设输入的格式如图所示(例如,subnet 块在第 1 列中以 } 结尾)...

使用捕获组的一个 sed 想法(因为 OP 似乎在示例代码中尝试):

myip='172.16.31.0'
sed -n -E "/^subnet ${myip} /,/^}/{s/.*(range dynamic-bootp[^;]*;).*/\1/p}" file

其中捕获组由 (range dynamic-bootp[^;]*;) 定义。

这会产生:

range dynamic-bootp 172.16.31.80 172.16.31.90;
,

如果您的文本始终具有完全相同的结构,您可以使用:

grep -A9 172\.16\.31\.0 test.txt | tail -n1 | cut -d' ' -f6-

如果结构(每块的行数、空格等),请将该信息添加到问题中。