
私はスクリプト作成のスキルが少し鈍っているので、ファイルを作成し(新しいファイル名を生成し)、ファイル内のIPアドレスを+1ずつ増やして編集するスクリプトを作成するための良い出発点を見つけようとしています。
私のシナリオは次のようになります。ネットワーク スクリプトに追加する IP アドレスが約 50 個あり、それぞれ 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
点を除いて、 file はまったく同じになります。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 アドレスが含まれる新しいファイルを生成するには、どのような手順を実行する必要がありますか。
前もって感謝します!
編集: ファイル名に IP アドレスを含めてはいけないことを明確にしておきます。
file1 を file2 にコピーする必要がありますeth0:1
->上記と同じファイル内容ですが、生成されたファイルのフィールドが 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
ファイルを変更するにはスイッチを追加できます所定の位置に。