
Estou um pouco enferrujado com minhas habilidades de script e estou tentando encontrar um bom ponto de partida para criar um script que crie arquivos (gerando novos nomes de arquivos) e edite o endereço IP no arquivo, incrementando-o em +1
Meu cenário é assim: temos cerca de 50 endereços IP para adicionar aos nossos scripts de rede, cada um com um IP incremental. Eu poderia fazer isso manualmente, mas achei que seria um bom momento para tentar atualizar minhas habilidades de script.
O esquema de nomenclatura é assim:
ifcfg-eth0:1, ifcfg-eth0:2, ifcfg-eth0:3 ...*n*
O conteúdo desses arquivos é:
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
Onde IPADDR=10.2.7.148
deve ser aumentado em +1 em cada arquivo.
Por exemplo:
ifcfg-eth0:2
file seria exatamente o mesmo, exceto que IPADDR
seria 10.2.7.149
e assim por diante.
Tenho quase certeza de que devo invocar sed
para localizar e substituir os endereços IP.
Por exemplo, a busca por um endereço IP usando sed
poderia ser realizada da seguinte forma:
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
Quais etapas precisam ser executadas para gerar um novo arquivo com o eth0:N
nome incrementado em +1, bem como o endereço IP no arquivo.
Desde já, obrigado!
EDIT: Deixe-me esclarecer que os nomes dos arquivos não devem conter o endereço IP.
Estou precisando que o arquivo1 seja copiado para o arquivo2 eth0:1
-> eth0:2
com o mesmo conteúdo do arquivo acima, exceto o fato de que o IPADDR=
campo no arquivo gerado deve ser incrementado em um.
Nota: O nome do arquivo também deve ser incrementado em +1 IE.cp ifcfg-eth0:1 ifcfg-eth0:2
Responder1
Tanto quanto sei, sed
não posso fazer cálculos em números, eu usariaawk
$ 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
Inclua isso em um loop de arquivos a serem alterados.
Explicação:
-F'.'
: use.
um separador de campo$1~"IPADDR"{}
: se o primeiro campo contiverIPADDR
padrão, execute o que está dentro{}
$NF++;OFS="."
: número de incremento no último campo (NF
denota o número de campos no registro).1
: imprima tudo
Responder2
Não sei se entendi direito. Isso faz o que você quer?
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;
Resultado:
[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
Responder3
Comperl:
$ perl -ne '
s/^(IPADDR=10\.2\.7\.)(\d+)/$2 < 255 and sprintf "%s%s", $1, $2 + 1/e;
print
' file
Saída:
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
Você pode adicionar -i
switch para modificar o arquivono lugar.