LoginSignup
18
19

More than 5 years have passed since last update.

Vim に惚れるシーン(IP アドレス と ポート番号 を分ける)

Last updated at Posted at 2015-02-03

シーン 3

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 に惚れます!

18
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19