
Meine Skriptkenntnisse sind etwas eingerostet und ich suche nach einem guten Ausgangspunkt für die Erstellung eines Skripts, das Dateien erstellt (neue Dateinamen generiert) und die IP-Adresse in der Datei bearbeitet, indem es sie um +1 erhöht.
Mein Szenario sieht so aus: Wir müssen unseren Netzwerkskripten etwa 50 IP-Adressen hinzufügen, jede mit einer inkrementellen IP. Ich könnte das manuell machen, aber ich dachte, dies wäre ein guter Zeitpunkt, um meine Skriptkenntnisse zu verbessern.
Das Benennungsschema sieht folgendermaßen aus:
ifcfg-eth0:1, ifcfg-eth0:2, ifcfg-eth0:3 ...*n*
Der Inhalt dieser Dateien ist:
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
Wobei IPADDR=10.2.7.148
in jeder Datei um +1 erhöht werden sollte.
Beispiel:
ifcfg-eth0:2
Die Datei wäre genau dieselbe, außer dass usw. wäre IPADDR
.10.2.7.149
Ich bin ziemlich sicher, dass ich aufrufen sollte, sed
um die IP-Adressen zu suchen und zu ersetzen.
sed
Die Suche nach einer IP-Adresse könnte beispielsweise folgendermaßen erfolgen:
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
Welche Schritte sind notwendig um eine neue Datei mit dem eth0:N
um +1 erhöhten Namen sowie der IP-Adresse in der Datei zu erzeugen.
Dank im Voraus!
BEARBEITEN: Lassen Sie mich klarstellen, dass die Namen der Dateien nicht die IP-Adresse enthalten sollten.
Ich muss Datei1 in Datei2 kopieren eth0:1
-> eth0:2
mit demselben Dateiinhalt wie oben, außer der Tatsache, dass das IPADDR=
Feld in der generierten Datei um eins erhöht werden soll.
Hinweis: Der Dateiname sollte auch um +1 erhöht werden, IE.cp ifcfg-eth0:1 ifcfg-eth0:2
Antwort1
Soweit ich weiß, sed
kann ich keine Berechnungen mit Zahlen durchführen, ich würde verwendenawk
$ 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ügen Sie dies in eine Schleife der zu ändernden Dateien ein.
Erläuterung:
-F'.'
: Verwenden Sie.
einen Feldtrenner$1~"IPADDR"{}
: Wenn das erste FeldIPADDR
ein Muster enthält, führen Sie den Inhalt aus{}
$NF++;OFS="."
: Zahl im letzten Feld erhöhen (NF
bezeichnet die Anzahl der Felder im Datensatz).1
: alles drucken
Antwort2
Ich weiß nicht, ob ich Sie richtig verstanden habe. Tut das, was Sie wollen?
Schlag:
[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;
Ergebnis:
[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
Antwort3
Mitperl:
$ perl -ne '
s/^(IPADDR=10\.2\.7\.)(\d+)/$2 < 255 and sprintf "%s%s", $1, $2 + 1/e;
print
' file
Ausgabe:
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
Sie können -i
einen Schalter hinzufügen, um die Datei zu ändernan Ort und Stelle.