Создание файлов конфигурации сети с использованием sed и bash

Создание файлов конфигурации сети с использованием sed и bash

Я немного заржавел в своих навыках написания скриптов и пытаюсь найти хорошую отправную точку для создания скрипта, который создает файлы (генерирует новые имена файлов) и редактирует IP-адрес в файле, увеличивая его на +1.

Мой сценарий такой - у нас есть около 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файл будет точно таким же, за исключением того, что IPADDRбудет 10.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-адресом в файле.

Заранее спасибо!

EDIT: Позвольте мне уточнить, что имена файлов не должны содержать IP-адрес.

Мне нужно скопировать file1 в file2 eth0:1-> eth0:2с тем же содержимым файла, что и выше, за исключением того, что IPADDR=поле в сгенерированном файле должно быть увеличено на единицу.

Примечание: имя файла также следует увеличить на +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переключатель для изменения файлана месте.

Связанный контент