使用 sed 和 bash 生成网络配置文件

使用 sed 和 bash 生成网络配置文件

我对我的脚本编写能力有点生疏,正在尝试找到一个良好的起点来创建一个脚本,该脚本创建文件(生成新文件名)并通过将其增加 +1 来编辑文件中的 IP 地址

我的场景是这样的 - 我们有大约 50 个 IP 地址要添加到我们的网络脚本中,每个地址都有一个递增的 IP。我可以手动完成此操作,但我认为这是尝试加快我的脚本编写技能的好时机。

命名方案如下:

ifcfg-eth0:1, ifcfg-eth0:2, ifcfg-eth0:3 ...*n*

这些文件的内容是:

DEVICE=eth0:1
NETMASK=255.255.255.0
IPADDR=10.2.7.148
BOOTPROTO=none
ONBOOT=yes
DNS1=10.2.53.150
PEERDNS=yes
DNS2=10.2.53.250
GATEWAY=10.2.7.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

每个文件中的位置IPADDR=10.2.7.148应增加+1。

例如: ifcfg-eth0:2文件将完全相同,除了将IPADDR10.2.7.149等等。

我相当确定我应该调用sed来查找和替换 IP 地址。

例如,使用搜索 IP 地址sed可以像这样完成:

sed -rn '/(IPPADDR=)((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file

需要采取什么步骤来生成一个名称eth0:N加+1的新文件以及文件中的IP地址。

提前致谢!

编辑:让我澄清一下文件名称不应包含 IP 地址。

我需要将 file1 复制到 file2 eth0:1-> ,eth0:2其文件内容与上面相同,但IPADDR=生成的文件上的字段应增加 1。

注意:文件名也应该以+1 IE 为增量。cp ifcfg-eth0:1 ifcfg-eth0:2

答案1

据我所知sed无法对数字进行计算,我会使用awk

$ awk -F'.' '$1~"IPADDR"{$NF++;OFS="."}1' file
DEVICE=eth0:1
NETMASK=255.255.255.0
IPADDR=10.2.7.149
BOOTPROTO=none
ONBOOT=yes
DNS1=10.2.53.150
PEERDNS=yes
DNS2=10.2.53.250
GATEWAY=10.2.7.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

将其包含到要更改的文件循环中。


解释:

  • -F'.': 使用.字段分隔符
  • $1~"IPADDR"{}:如果第一个字段包含IPADDR模式,则运行里面的内容{}
  • $NF++;OFS=".":最后一个字段的增量号(NF表示记录中的字段数)。
  • 1: 打印所有内容

答案2

我不知道我是否正确理解了你的意思。这是你想要的吗?

重击:

[root@domain]:test # IP=120
[root@domain]:test # for i in {1..50}; do
> echo "IP=10.11.11.$IP
> NETMASK=255.255.255.0
> DEVICE=eth0:1
> ONBOOT=yes
> DNS1=10.2.53.150
> PEERDNS=yes
> DNS2=10.2.53.250
> GATEWAY=10.2.7.1
> TYPE=Ethernet
> USERCTL=no
> IPV6INIT=no" >> ifcfg-eth0:$i; IP=$((IP+1)); done;

结果:

[root@domain]:test # ls ifcfg* |wc -l
50
[root@domain]:test # grep IP= ifcfg*
ifcfg-eth0:1:IP=10.11.11.120
...
ifcfg-eth0:50:IP=10.11.11.169

答案3

:

$ perl -ne '
    s/^(IPADDR=10\.2\.7\.)(\d+)/$2 < 255 and sprintf "%s%s", $1, $2 + 1/e;
    print
' file

输出:

DEVICE=eth0:1
NETMASK=255.255.255.0
IPADDR=10.2.7.149
BOOTPROTO=none
ONBOOT=yes
DNS1=10.2.53.150
PEERDNS=yes
DNS2=10.2.53.250
GATEWAY=10.2.7.1
TYPE=Ethernet
USERCTL=no
IPV6INIT=no

可以添加-i开关来修改文件到位

相关内容