シーン
Yamaha のルータで、NAT の変換テーブルを調査している時、次のような出力に悩まされることがあります。
> show nat descriptor address detail
参照NATディスクリプタ : 1, 適用インタフェース : LAN2(1)
Masqueradeテーブル
外側アドレス: primary/xxx.xxx.xxx.xxx
ポート範囲: 60000-64095, 49152-59999, 44096-49151 12231個使用中
プロトコル 内側アドレス 宛先 マスカレード TTL(秒)
UDP 172.22.11.13.63646 200.172.127.74.53 59355 1
TCP 172.19.1.17.61312 113.127.234.60.80 56468 1
TCP 172.32.3.49.50138 61.32.128.97.110 56737 1
TCP 172.25.4.6.56077 51.235.213.115.80 50755 39
TCP 172.17.1.110.51283 101.162.236.199.443 63259 1
TCP 172.24.4.9.56076 53.214.30.162.80 51170 45
TCP 172.28.1.9.56068 201.232.238.6.80 61462 39
TCP 172.33.3.2.50330 69.32.120.91.110 57941 1
UDP 172.27.16.39.57780 215.168.126.68.53 55026 2
:
よく見てみると、IP アドレスと ポート番号 が "."(ドット)で区切られています。
これが IP アドレスの区切り文字の "."(ドット)と同じために、調査する際に扱いにくいことがあります。
どうしたい?
IP アドレスと ポート番号を分離しやすいように区切り文字を "."(ドット)から ":"(コロン)に変更したい。
つまり、次のように置換したいと思います。
> show nat descriptor address detail
参照NATディスクリプタ : 1, 適用インタフェース : LAN2(1)
Masqueradeテーブル
外側アドレス: primary/210.172.124.109
ポート範囲: 60000-64095, 49152-59999, 44096-49151 12231個使用中
プロトコル 内側アドレス 宛先 マスカレード TTL(秒)
UDP 172.22.11.13:63646 200.172.127.74:53 59355 1
TCP 172.19.1.17:61312 113.127.234.60:80 56468 1
TCP 172.32.3.49:50138 61.32.128.97:110 56737 1
TCP 172.25.4.6:56077 51.235.213.115:80 50755 39
TCP 172.17.1.110:51283 101.162.236.199:443 63259 1
TCP 172.24.4.9:56076 53.214.30.162:80 51170 45
TCP 172.28.1.9:56068 201.232.238.6:80 61462 39
TCP 172.33.3.2:50330 69.32.120.91:110 57941 1
UDP 172.27.16.39:57780 215.168.126.68:53 55026 2
:
どうする?
正規表現を使った置換で簡単にできますよね?
よくありそうな解決法
:%s/\v(\d+\.\d+\.\d+\.\d+)\.(\d+)/\1:\2/g
グループ化 (...)
と、部分文字列参照 \1
や \2
でさらりと解決ですね。
「IP アドレスとポート番号を取り出して、":"(コロン)で区切ってやる」
これは、Vim だけではなく、他の多くのエディタで使える方法だと思います。
Vim らしい(?) 解決法
Vim らしいかどうかは分かりませんが、Vim ならこんな解決方法もあります。
:%s/\v\d+\.\d+\.\d+\.\d+\zs\.\ze\d+/:/g
マッチの開始点 \zs
と マッチの終了点 \ze
を指定する方法です。
先ほどの「よくありそうな解決法」での置換とくらべると、着目点が逆になっていますね。
「IPアドレスとポート番号の間の "."(ドット)を ":"(コロン)に置き換える」
こちらの方が、少しだけ 直感的に表現できているとは思いませんか?
まとめ
\zs
と\ze
便利!- 選べる解決法があるのは、嬉しい。(直感的な解決法につながる)
- 2タッチ少ない(これはオマケです)
発想を素直に表現できる Vim に惚れます!