从配置文件(/ etc / network / interfaces)获取init.d脚本的值

时间:2015-05-18 09:58:04

标签: bash configuration-files

我想从/ 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; }

1 个答案:

答案 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