在 dhcp conf 文件中提取包含范围的行
Extract lines containing range in a dhcp conf file
我想提取包含特定子网范围的文件中的行
输入:
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
如果您的文本始终具有完全相同的结构,您可以使用:
grep -A9 172\.16\.31\.0 test.txt | tail -n1 | cut -d' ' -f6-
如果结构(每个块的行数、空格等)请将该信息添加到问题中。
使用 GNU sed
和 bash
:
n="172.16.31.0"
n="${n//./\.}" # escape every dot
sed -n '/subnet '"$n"' /,/^}/ {/range/{s/^ *//p}}' file
更新以删除前导空格 and/or 制表符:
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[^;]*;).*//p}" file
其中捕获组由 (range dynamic-bootp[^;]*;)
定义。
这会生成:
range dynamic-bootp 172.16.31.80 172.16.31.90;
我想提取包含特定子网范围的文件中的行
输入:
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
如果您的文本始终具有完全相同的结构,您可以使用:
grep -A9 172\.16\.31\.0 test.txt | tail -n1 | cut -d' ' -f6-
如果结构(每个块的行数、空格等)请将该信息添加到问题中。
使用 GNU sed
和 bash
:
n="172.16.31.0"
n="${n//./\.}" # escape every dot
sed -n '/subnet '"$n"' /,/^}/ {/range/{s/^ *//p}}' file
更新以删除前导空格 and/or 制表符:
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[^;]*;).*//p}" file
其中捕获组由 (range dynamic-bootp[^;]*;)
定义。
这会生成:
range dynamic-bootp 172.16.31.80 172.16.31.90;