特定NICのIPアドレスをもっとかんたんに取得したい…

呪わしき社会の変化に伴い ip コマンドを使うようスイッチさせられたわけで。とはいえ、ifconfig より多少は出力が構造化されてて sed とか使わなくても取れるようになっているのかと思えばなっていない今日このごろ。

このあいだまで、NICの切り分けすら ip 単体でできず、

$ DEVICE=docker0
$ ADDR=$( 
    /sbin/ip -f inet -o addr 
    | /bin/grep "${DEVICE-}" 
    | /bin/sed -e 's/^.* *inet  *([0-9.][0-9.]*).*$/1/' 
)
$ echo $ADDR
172.17.42.1
$ 

などとしていたわけだが「たかがIPアドレス確認で3つもコマンド立ち上げるのかよ!」という不満がありありだった。

と思ってたら、show サブコマンドの存在に今ごろ気づいた…。

$ ip -o -f inet addr show dev docker0

とすれば、

3: docker0    inet 172.17.42.1/16 scope global docker0       valid_lft forever preferred_lft forever

のように特定NICの情報を取るのに grep が要らない。

$ DEVICE=docker0
$ /sbin/ip -o -f inet addr show dev "${DEVICE-}" 
    | /bin/sed -e 's/^.* *inet[[:blank:]]{1,}([0-9.]{1,}).*$/1/'

sed の正規表現がより厳密になっているのは単なる心変わり…とはいえこれ、grep がなくなっただけで、けっきょく sed 呼ばなきゃいけないのは同じなんだよなあ…。

  • もっと短くならないの?
  • そもそもコマンドの引数がキー・バリューペアになってなくて位置による解釈なのはイヤだ

という気がする。なんかもっとうまい方法ないのかな。

ちなみに hostname -i だと全NICのIPアドレスが羅列されて、手数が増えるだけなのでパス。