• このエントリーをはてなブックマークに追加

【linux豆知識】IPアドレス・MACアドレスを連番で生成する方法(awk)

  • このエントリーをはてなブックマークに追加

awk
zaco muraです。

自分が扱っているシステムの試験で、MACアドレスとIPアドレスを大量に作る必要が出てきたのでメモしておきます。

環境

・centos6
・awk

欲しい結果

こんな感じのデータが20万件ほど欲しいと思っていました

00:00:00:00:00:00 = 10.0.0.0
00:00:00:00:00:01 = 10.0.0.1
・・・・・・・
(20万件分続く)

これは10進数で表示したり16進数で表示したり、256ずつオクテットが変わったりと意外と面倒で、excelとかだと結構作りづらいです。

実現方法

いろいろと方法はあるかと思いますが、awk大好きな私としてはawkのワンライナーでやりました。結果こんな感じのコマンドになりました。

[root@server ~]# awk 'BEGIN{for(i=0;i<200000;i++){printf("00:00:00:%02x:%02x:%02x = 10.%d.%d.%d\n",(i/65536)%256,(i/256)%256,i%256,(i/65536)%256,(i/256)%256,i%256)}}'
00:00:00:00:00:00 = 10.0.0.0
00:00:00:00:00:01 = 10.0.0.1
00:00:00:00:00:02 = 10.0.0.2
---- 中略 ----
00:00:00:00:00:ff = 10.0.0.255
00:00:00:00:01:00 = 10.0.1.0
---- 中略 ----
00:00:00:00:ff:ff = 10.0.255.255
00:00:00:01:00:00 = 10.1.0.0
---- 中略 ----
00:00:00:03:0d:3e = 10.3.13.62
00:00:00:03:0d:3f = 10.3.13.63

無事実現できました。コマンドの解説をしていくので、わかりやすく改行を入れていきます

awk 'BEGIN{
  for(i=0;i<200000;i++){
    printf("00:00:00:%02x:%02x:%02x = 10.%d.%d.%d\n",(i/65536)%256,(i/256)%256,i%256,(i/65536)%256,(i/256)%256,i%256)
  }
}'
1行目 今回はawkに対する入力がないので、BEGIN句を使います。
2行目 for文を使って20万回分繰り返しています
3行目 MACとIPを表示する部分です。桁数を合わせたり16進数で表示するということがやりやすいのでprintfを使っています。(詳細な解説は後述)
その後 かっこを閉じています

3行目の詳細

00:00:00:%02x:%02x:%02x の部分 %xは16進数表示です。1桁の場合でも0で桁を揃えたいので”02″という桁揃えをしています。
10.%d.%d.%d の部分 %dは10進数表示です。
(i/65536)%256 の部分 IPアドレスの第2オクテット、MACアドレスの第4オクテットを表しています。65536(256の2乗)以上を表すので、65536で割った数値をmod256した結果を表示します。
(i/256)%256 の部分 IPアドレスの第3オクテット、MACアドレスの第5オクテットを表しています。256〜65535を表しています。
i%256 の部分 IPアドレスの第4オクテット、MACアドレスの第6オクテットを表しています。0〜255を表しています。

MAC部分とIP部分があるので、それぞれを2回表示しています。
※要するに、MACとIPの違いは16進数で表示するか10進数で表示するかだけです。

まとめ

以上、MAC/IPをawkで生成する方法でした。こう言うのがパッと作れるとスキルが上がった気がして嬉しくなります。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link