从dhcp配置文件中提取包含range的行



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

输入:

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子网提取范围动态引导。

预期输出:

range dynamic-bootp 172.16.31.80 172.16.31.90; 

有什么解决方案吗?

更新:内容的结构将不一样,行可能会根据配置要求添加/删除

尝试——

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

对于GNUsedbash:

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

输出:

假设输入格式如下所示(例如,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-

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

最新更新