Создание сетевых конфигурационных файлов с помощью 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-адрес.

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

Примечание. Имя файла также должно быть увеличено на +1 IE. cp ifcfg-eth0:1 ifcfg-eth0:2

3 Solutions collect form web for “Создание сетевых конфигурационных файлов с помощью sed и bash”

Насколько мне известно, 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 : распечатать все

Я не знаю, правильно ли я вас понял. Делает ли это то, что вы хотите?

Bash:

 [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 

С perl :

 $ 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 чтобы изменить файл на месте .

  • считывать ввод от пользователя во время цикла, имеющего перенаправление ввода и вывода
  • Как проверить, существует ли один или оба из двух файлов?
  • Быстрый метод разделения строки из текстового файла?
  • Определение разницы в датах в формате «% Y% m% d% H% M% S»
  • Как найти точную строку без ведущего или конечного символа
  • Как создать список элементов под определенными заголовками в текстовом документе? (Linux / Bash)
  • Значение '2>> (команда)' Перенаправление в Bash
  • Подкатегории MV на один уровень, но не root
  • sudo в неинтерактивном скрипте
  • Loop sed из шаблона с различными выходами из текстового файла, содержащего переменные
  • Использование basename для расширения расширений файла и поиска файлов с тем же именем
  • Linux и Unix - лучшая ОС в мире.