ip アドレスを数字順にソートしたい。
IPアドレスソートするにはいろいろな答えが思い浮かぶ。
今回は、整数に変換してソートしてみたいと思う。
ip アドレスを10進数に変換する
256進数だから、桁数分だけ256を掛けてあげれば良い。
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.2
が 2.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アドレスをソートできた
まとめ
整数値に変換してソートすると確実である。
awk -F '.' '{ printf "%.0f %d.%d.%d.%d\n",$1*16777216+$2*65536+$3*256+$4,$1, $2,$3, $4 }'
10進数の整数値に置き換える方法は、覚えておくと便利である。
EXCELなどでも汎用的に使えて便利だと思う。
また、IPソートのためだけにプログラム言語に外部のipaddr ライブラリを入れずに済むので依存モジュールを減らすことができる。
ただ、コマンドで扱うなら、どう考えてもソート・コマンドで実装したほうが楽です。