
Я немного заржавел в своих навыках написания скриптов и пытаюсь найти хорошую отправную точку для создания скрипта, который создает файлы (генерирует новые имена файлов) и редактирует 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
переключатель для изменения файлана месте.