Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

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

$
0
0

シーン

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


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>