从 init.d 脚本的配置文件 (/etc/network/interfaces) 中获取值
Get a value from a config file (/etc/network/interfaces) for an init.d script
我想从我的 /etc/network/interfaces 文件中获取网络地址 (192.168.42.)。
我只对接口 "wlan0" 感兴趣,最好检查一下下面的部分是否存在。
在 "wlan0" 的示例接口文件中,IP 地址为 192.168.42.1。对于 init.d 脚本,我随后想用 *.255 替换最后一个字节 (*.1)。所以 IP 应该是:“192.168.42.255”
有人知道如何从这样的文件中为 init.d 脚本读取网络地址并替换最后一个字节吗?
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
目前我只知道如何判断文件是否存在
# Check for existence of needed config file and read it
test -r $CONFIGF || { echo "$CONFIGF not existing";
if [ "" = "stop" ]; then exit 0;
else exit 6; fi; }
我会为此使用 awk
,因为它非常易读:
awk -v par="wlan0" '
/^iface/ && ==par {f=1}
/^iface/ && !=par {f=0}
f && /^\s*address/ {print ; f=0}' file
说明
-v par="wlan0"
提供您要检查的接口名称
/^iface/ && ==par {f=1}
如果一行以 iface
开头并且第二个值是给定的接口名称,则设置一个标志。
/^iface/ && !=par {f=0}
如果一行以 iface
开头并且第二个值不是给定的接口名称,则取消设置标志。
f && /^\s*address/ {print ; f=0}
如果设置了标志并且一行以 address
开头,则打印第二个黑色,作为 IP。然后,重置计数器(感谢 Etan Reisner 的想法)。
请注意,这会检查这些行是否未被注释。
如果你想把最后一个.1
替换成.255
,你可以把最后一个条件替换成这样:
f && /^\s*address/ {ip=; sub(".1$", ".255", ip); print ip; f=0}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
测试
根据您的输入给出一个文件:
$ cat a
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
iface eth1 inet static
address yyy.yyy.yyy.yyy
netmask 255.255.255.0
它returns:
$ awk -v par="wlan0" '/^iface/ && ==par {f=1} /^iface/ && !=par {f=0} f && /^\s*address/ {print ; f=0}' a
192.168.42.1
并替换 ip 的最后一部分:
$ awk -v par="wlan0" '/^iface/ && ==par {f=1} /^iface/ && !=par {f=0} f && /^\s*address/ {ip=; sub(".1$", ".255", ip); print ip; f=0}' a
192.168.42.255
我想从我的 /etc/network/interfaces 文件中获取网络地址 (192.168.42.)。 我只对接口 "wlan0" 感兴趣,最好检查一下下面的部分是否存在。
在 "wlan0" 的示例接口文件中,IP 地址为 192.168.42.1。对于 init.d 脚本,我随后想用 *.255 替换最后一个字节 (*.1)。所以 IP 应该是:“192.168.42.255”
有人知道如何从这样的文件中为 init.d 脚本读取网络地址并替换最后一个字节吗?
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
目前我只知道如何判断文件是否存在
# Check for existence of needed config file and read it
test -r $CONFIGF || { echo "$CONFIGF not existing";
if [ "" = "stop" ]; then exit 0;
else exit 6; fi; }
我会为此使用 awk
,因为它非常易读:
awk -v par="wlan0" '
/^iface/ && ==par {f=1}
/^iface/ && !=par {f=0}
f && /^\s*address/ {print ; f=0}' file
说明
-v par="wlan0"
提供您要检查的接口名称/^iface/ && ==par {f=1}
如果一行以iface
开头并且第二个值是给定的接口名称,则设置一个标志。/^iface/ && !=par {f=0}
如果一行以iface
开头并且第二个值不是给定的接口名称,则取消设置标志。f && /^\s*address/ {print ; f=0}
如果设置了标志并且一行以address
开头,则打印第二个黑色,作为 IP。然后,重置计数器(感谢 Etan Reisner 的想法)。
请注意,这会检查这些行是否未被注释。
如果你想把最后一个.1
替换成.255
,你可以把最后一个条件替换成这样:
f && /^\s*address/ {ip=; sub(".1$", ".255", ip); print ip; f=0}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
测试
根据您的输入给出一个文件:
$ cat a
iface eth0 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.0
iface wlan0 inet static
address 192.168.42.1
netmask 255.255.255.0
iface eth1 inet static
address yyy.yyy.yyy.yyy
netmask 255.255.255.0
它returns:
$ awk -v par="wlan0" '/^iface/ && ==par {f=1} /^iface/ && !=par {f=0} f && /^\s*address/ {print ; f=0}' a
192.168.42.1
并替换 ip 的最后一部分:
$ awk -v par="wlan0" '/^iface/ && ==par {f=1} /^iface/ && !=par {f=0} f && /^\s*address/ {ip=; sub(".1$", ".255", ip); print ip; f=0}' a
192.168.42.255