それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

IPアドレスを数字順にソートする(整数に変換)

ip アドレスを数字順にソートしたい。

IPアドレスソートするにはいろいろな答えが思い浮かぶ。

今回は、整数に変換してソートしてみたいと思う。

ip アドレスを10進数に変換する

256進数だから、桁数分だけ256を掛けてあげれば良い。

IPアドレスを10進数に変換する例. awk

echo 10.0.0.0 |  \
  awk -F '.' '{ printf "%.0f %d.%d.%d.%d\n",$1*16777216+$2*65536+$3*256+$4,$1, $2,$3, $4 }'

実行結果

167772160 10.0.0.0

IPアドレスをソート(文字列)

単純に文字列でソートとした場合

cat << EOS | sort
172.16.10.2
172.16.1.1
172.16.2.10
EOS

実行結果

172.16.1.1
172.16.10.2
172.16.2.10

文字列でソートすると辞書順になり、上記のように、10.22.10 より先に来てしまう。

IPアドレスをソート(整数値に変換)

いったん、整数値に変換して、それをソートすれば良いとわかったで、試してみる。

簡単のためにテキストにip一覧を入れる。

cat << EOS > test.txt
172.16.10.2
172.16.1.1
172.16.2.10
EOS

整数値を計算して書き出す。

 cat test.txt | awk -F '.' '{ printf "%.0f %d.%d.%d.%d\n",$1*16777216+$2*65536+$3*256+$4,$1, $2,$3, $4 }'

実行結果

2886729985 172.16.1.1
2886732290 172.16.10.2
2886730250 172.16.2.10

さらにソートする。

cat test.txt | awk -F '.' '{ printf "%.0f %d.%d.%d.%d\n",$1*16777216+$2*65536+$3*256+$4,$1, $2,$3, $4 }' | sort

実行結果

2886729985 172.16.1.1
2886730250 172.16.2.10
2886732290 172.16.10.2

ソート用の先頭カラムを除去する

cat test.txt | \
awk -F '.' '{ printf "%.0f %d.%d.%d.%d\n",$1*16777216+$2*65536+$3*256+$4,$1, $2,$3, $4 }' |\
 sort  | awk '{ print $2}'

実行結果

172.16.1.1
172.16.2.10
172.16.10.2

これで、IPアドレスをソートできた

まとめ

整数値に変換してソートすると確実である。

IPアドレスの整数値の計算をする awk

awk -F '.'  '{ printf "%.0f %d.%d.%d.%d\n",$1*16777216+$2*65536+$3*256+$4,$1, $2,$3, $4 }'

10進数の整数値に置き換える方法は、覚えておくと便利である。

EXCELなどでも汎用的に使えて便利だと思う。

また、IPソートのためだけにプログラム言語に外部のipaddr ライブラリを入れずに済むので依存モジュールを減らすことができる。

ただ、コマンドで扱うなら、どう考えてもソート・コマンドで実装したほうが楽です。