
Estoy un poco oxidado en mis habilidades de secuencias de comandos y estoy tratando de encontrar un buen punto de partida para crear una secuencia de comandos que cree archivos (generando nuevos nombres de archivos) y edite la dirección IP en el archivo incrementándola en +1.
Mi escenario es el siguiente: tenemos alrededor de 50 direcciones IP para agregar a nuestros scripts de red, cada una con una IP incremental. Podría hacer esto a mano, sin embargo, pensé que sería un buen momento para intentar ponerme al día con mis habilidades de programación.
El esquema de nombres es el siguiente:
ifcfg-eth0:1, ifcfg-eth0:2, ifcfg-eth0:3 ...*n*
El contenido de estos archivos es:
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
Donde IPADDR=10.2.7.148
se debe aumentar en +1 en cada archivo.
Por ejemplo:
ifcfg-eth0:2
el archivo sería exactamente el mismo excepto que IPADDR
sería 10.2.7.149
y así sucesivamente.
Estoy bastante seguro de que debo invocar sed
para buscar y reemplazar las direcciones IP.
Por ejemplo, la búsqueda de una dirección IP sed
se puede realizar así:
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
Qué pasos se deben seguir para generar un nuevo archivo con el eth0:N
nombre incrementado en +1, así como la dirección IP en el archivo.
¡Gracias de antemano!
EDITAR: Permítanme aclarar que los nombres de los archivos no deben contener la dirección IP.
Necesito copiar el archivo1 al archivo2 eth0:1
-> eth0:2
con el mismo contenido de archivo que el anterior, excepto el hecho de que el IPADDR=
campo en el archivo generado debe incrementarse en uno.
Nota: El nombre del archivo también debe incrementarse en +1 IE.cp ifcfg-eth0:1 ifcfg-eth0:2
Respuesta1
Hasta donde yo sé, sed
no puedo hacer cálculos con números, usaríaawk
$ 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
Incluya esto en un bucle de archivos que se van a cambiar.
Explicación:
-F'.'
: use.
un separador de campo$1~"IPADDR"{}
: si el primer campo contieneIPADDR
un patrón, ejecute lo que hay dentro{}
$NF++;OFS="."
: incrementa el número en el último campo (NF
indica el número de campos en el registro).1
: imprime todo
Respuesta2
No sé si te he entendido bien. ¿Hace esto lo que quieres?
Intento:
[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
Respuesta3
Conperla:
$ perl -ne '
s/^(IPADDR=10\.2\.7\.)(\d+)/$2 < 255 and sprintf "%s%s", $1, $2 + 1/e;
print
' file
Producción:
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
Puede agregar -i
un interruptor para modificar el archivo.en su lugar.