生産性を向上させるネットワークエンジニアのための 5 つの vim 活用法

# 背景
この記事はシスコの有志による Advent Calendar の一部として投稿しています。
https://qiita.com/advent-calendar/2018/cisco

ネットワークエンジニアの業務は、コンフィグやログに対する操作が多く、それらを効率的にこなすことで生産性が向上します。ここでは、普段業務でネットワーク機器を触っているエンジニアが、vim をどのように活用しているか 5 つの例を紹介します。
いくつかのコマンドは、IOS-XR などのシェルから起動する vim でも使えるため、うまく使いこなせばファイルを外部システムにコピーすることなくルータ上で作業ができ、とても作業効率が良くなります。

1. コンフィグ・ログの差分を比較する: diffthis
1. コンフィグ・ログの複数箇所を同時に閲覧: split + scrollbind
1. 大量のテストコンフィグを生成する: キーマクロ+インクリメント
1. 大量のテストコンフィグを削除する: global コマンド+置換
1. パケットを編集する: xxd
  


# コンフィグ・ログの差分を比較する: diffthis 
ネットワークエンジニアがエディタを使ってコンフィグやログを確認している時に、差分を確認したくなることが良くあります。Windows では windiff などのツールもありますが、vim さえあれば簡単に差分を比較することができます。
初めから diff を取ることが分かっていれば "vimdiff R1.cfg R2.cfg" のようにも実行できますが、ここではファイルを開いた状態からの diff の取り方を紹介します（個人的によく使うので）。ここでは 2 つのファイル、R1.cfg および R2.cfg の差分比較をする場合を考えます。

![advent01-sub.gif](https://qiita-image-store.s3.amazonaws.com/0/156216/9081b2dd-592d-ad3d-c00d-7f1536514794.gif)

操作説明

+ vim R1.cfg R2.cfg で比較したいファイルを開く
+ :split でウインドウを分割（左右に分割したい時は :vplist）
+ :bn でバッファを変更し次のファイルを表示
+ :diffthis と入力
+ CTRL-w j で下のウインドウへ移動（左右の場合は CTRL+w l で右のウインドウへ移動）
+ :diffthis と入力




# コンフィグ・ログの複数箇所を同時に閲覧: split + scrollbind 
コンフィグ内にインターフェイスが大量にある場合など、コンフィグ内の複数の箇所を同時に表示したい場合があります。その場合は scrollbind が便利です。ここでは R1.cfg 内の複数箇所を同時に見たい場合を考えます(すでに R1.cfg を開いている想定)。

![advent02-sub.gif](https://qiita-image-store.s3.amazonaws.com/0/156216/fb11b72b-2532-09a1-4c87-9e5fcc701f52.gif)

操作説明

+ :split でウインドウを分割（左右に分割したい時は :vplist）
+ :bn でバッファを次に移動し次のファイルを表示
+ :set scrollbind を設定
+ CTRL-w j で下のウインドウへ移動（左右の場合は CTRL+w l で右のウインドウへ移動）
+ 見たい場所へ移動
+ :set scrollbind を設定

IOS-XR などのシェルから起動する vim でも動作確認済みですので、ルータ上でのコンフィグやログの閲覧に役立ちます。



# 大量のテストコンフィグを生成する: キーマクロ+インクリメント 
ネットワーク機器の検証などで、インターフェイスを大量に作成するなど、コンフィグを繰り返し作成したい場合があります。Excel を使ったり、Python スクリプトを使ってもできますが、vim を使えばそうしたコンフィグも簡単に作成できます。
ここでは Tunnel インターフェイスを、Tunnel 番号をインクリしながら 100 個追加したいとします。ここでは、vim のデフォルトキーバインドである CTRL-a によるインクリを使っています。

実行例
![advent03-sub.gif](https://qiita-image-store.s3.amazonaws.com/0/156216/a158e30c-fd35-d54b-a1b4-889776514038.gif)

操作説明

+ vim tmp.txt でファイルを開く（Tunnel インターフェイスコンフィグが 1 つある状態）
+ qa でマクロを "a" で開始
+ SHIFT-v で繰り返したいコンフィグを選択後 y でヤンク
+ 繰り返したい範囲の末尾へ移動後、p で貼り付け $ で行末（インクリしたい箇所）へ
+ CTRL-a でインクリし、0 で行頭へ（マクロを終わらす時のカーソルの場所が重要！）
+ q でマクロの記録終了
+ 100@a で、a に記録された上記キーマクロを 100 回繰り返し

IOS-XR などのシェルから起動する vim でも動きますので、ルータ内で作っておいて load コマンドや copy コマンドで読み込むことができます。





# 大量のテストコンフィグを削除する: global コマンド+置換 
大量のテストコンフィグを流した後、今度は消したくなる場合があります。このときにも vim は活躍します。
vim の global コマンドを使ってインターフェイスだけを抜き出した後、行頭に no をつけることで、一気にコンフィグ削除用ファイルが完成します。

![advent05-sub.gif](https://qiita-image-store.s3.amazonaws.com/0/156216/67335b25-4206-286f-3fe1-201967f8da46.gif)

操作説明

+ :%g!/^interface/d で ^interface 行だけを抽出
+ :%s/^/no /g で行頭に no を追加

あとはこのコンフィグを load コマンドや copy コマンドなどで流し込めば簡単に削除できます。


# パケットを編集する: xxd
ネットワークの試験などで、キャプチャしたパケットを加工して送出したい場合があります。このようなときは、通常 Wireshark の編集機能を使うかバイナリエディタを探すことが多いと思いますが、vim （と xxd）を使うと手軽に編集できて便利です。

![advent04-sub.gif](https://qiita-image-store.s3.amazonaws.com/0/156216/7fb419f4-07e5-f2db-a28b-b7f819b85f70.gif)

操作説明

+ vim -b packet.pcap でパケットキャプチャを vim で開く
+ :%!xxd でテキストモードに変換
+ 必要な箇所を編集（ここでは送信元 IP アドレスを 10.1.1.1 から 10.10.10.10 に変更しています）
+ :%!xxd -r でバイナリに戻し保存


# おわりに
私自身もまだまだ使いこなせていない機能が多い vim です。今後も役に立つネタがあったらシェアして行きたいと思います。皆様、楽しいクリスマスをお迎えください。