$ ip -o a s| perl -nle 'if(/^\d+: (\w+)\s+inet ([\d\.]+)\/(\d+) /){ $e=join(".", unpack("C*",pack("N",0x100000000-(2**(32-$3)))));print "$1\t$2\t$e"}' lo 127.0.0.1 255.0.0.0 eth0 172.16.1.1 255.255.0.0 usb0 192.168.7.2 255.255.255.252
ipコマンド
ip --oneline addr show
--onelineで1行ずつ表示してくれるのホント便利。 これがデフォルトでいいよもう
1: lo inet 127.0.0.1/8 scope host lo\ valid_lft forever preferred_lft forever
とりあえずipv6(inet6)は無視する
ネットマスクの /8 とか /16 とかの表記を 255.0.0.0 とか 255.255.0.0 とかに変換する
$d = 0x100000000-(2**(32-$a)));
整数値をipv4っぽく変換する
Perlの組み込み関数 pack の翻訳 - perldoc.jp
エンディアンをひっくりかえし*1、1バイトずつに分解し*2、"."でくっつける
$e=join(".", unpack("C*",pack("N",$d)))