我想从/ etc / network / interfaces文件中获取网络地址(192.168.42。)。 我只对界面“wlan0”感兴趣,最好检查下面的部分是否存在。
在“wlan0”的示例interfaces文件中,IP地址为192.168.42.1。对于init.d脚本,我随后想要将最后一个字节(* .1)替换为* .255。所以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 [ "$1" = "stop" ]; then exit 0;
else exit 6; fi; }
答案 0 :(得分:3)
我会使用awk
,因为它非常易读:
awk -v par="wlan0" '
/^iface/ && $2==par {f=1}
/^iface/ && $2!=par {f=0}
f && /^\s*address/ {print $2; f=0}' file
-v par="wlan0"
提供您要检查的界面名称/^iface/ && $2==par {f=1}
如果一行以iface
开头且第二个值是给定的接口名称,请设置一个标志。/^iface/ && $2!=par {f=0}
如果一行以iface
开头且第二个值不是给定的接口名称,则取消设置该标志。f && /^\s*address/ {print $2; f=0}
如果设置了标志并且行以address
开头,则打印第二个黑色,即IP。然后,重置计数器(感谢Etan Reisner的想法)。请注意,这会检查这些行是否已注释。
如果您想将最后一个.1
替换为.255
,您可以将最后一个条件替换为:
f && /^\s*address/ {ip=$2; 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
它返回:
$ awk -v par="wlan0" '/^iface/ && $2==par {f=1} /^iface/ && $2!=par {f=0} f && /^\s*address/ {print $2; f=0}' a
192.168.42.1
并替换ip的最后部分:
$ awk -v par="wlan0" '/^iface/ && $2==par {f=1} /^iface/ && $2!=par {f=0} f && /^\s*address/ {ip=$2; sub(".1$", ".255", ip); print ip; f=0}' a
192.168.42.255