新卒インフラエンジニア向けLinuC 101 試験対策シリーズの第11回です。本シリーズを通して何度か「vi で開いて」「設定を編集して」と書いてきましたが、今回が vi/vim 専用の回です。
vi はリモートサーバーで作業する技術職にとって避けて通れないエディタです。新卒の挫折ポイント第1位と言ってもよく、「i を押しても何も起きない」「Esc って何のため」と詰まりがちです。本記事は完璧を目指さず、最低限の操作で生き延びるところから段階的に積み上げる構成です。
環境前提
- ディストリビューション: AlmaLinux 9.6(Sage Margay)
- ユーザー:
developer(sudo NOPASSWD設定済み) - 関連VM:
linuc-alma(10.0.10.132) - 初期状態:
vim-minimalのみ(vim-enhancedは記事内で導入 → 末尾削除) nanoは AlmaLinux 9 minimal install には未搭載- 演習用ディレクトリ
~/linuc-vim/を作成 → 末尾でクリーンアップ
今ここマップ
LinuC 101 試験対策シリーズ(全12回)
第1回 Linuxの起動・接続・停止
第2回 ブートプロセスの仕組み
第3回 systemdマスター講座
第4回 プロセス管理とハードウェア基礎
第5回 仮想マシンとコンテナの基礎
第6回 パッケージ管理マスター
第7回 ファイル操作の実践
第8回 パーミッション・所有者・特殊権限
第9回 コマンドライン・リダイレクト・パイプ
第10回 テキスト処理(grep / sed / awk)
▶ 第11回 vi/vim 入門 ← いまここ
第12回 ディスク・パーティション・ファイルシステム
この記事で身につくこと
- ノーマル / インサート / コマンドラインの3モードを切り替えられる
- 基本編集操作(
iaoxddyypu)を実行できる - 検索(
/)と置換(:s)、保存(:w)、終了(:q:wq:q!)ができる ~/.vimrcを作成し、行番号・シンタックスハイライト等の基本設定を有効化できるnanoとの違いを理解し、状況に応じて使い分けられる
第1章:なぜ vi を学ぶのか
VS Code や Sublime Text のような GUI エディタは便利ですが、本番サーバーには GUI がありません。SSH で入って、目の前にあるのはターミナル。そこで唯一頼れるのが vi(または vim)です。
- 最小インストールでも入っている:
vim-minimalは AlmaLinux/RHEL 系の最小構成パッケージに含まれる - 軽い・速い:起動が一瞬で、巨大ファイルでも引っかからない
- SSH 経由で完璧に動く:マウスもグラフィックも不要
- 業界標準:
visudocrontab -egit rebase -iなど、多くのツールが裏で vi を起動する
vi と vim は実質同じ
「vi」と「vim」は別物のように見えますが、現代の Linux ではほぼ同じものです。AlmaLinux 9 の /usr/bin/vi は短いシェルスクリプトで、中身を見るとこうなっています。
linuc-almaで実行:
$ file /usr/bin/vi
実行結果:
/usr/bin/vi: a /usr/bin/sh script, ASCII text executable
linuc-almaで実行:
$ head -20 /usr/bin/vi
実行結果(抜粋):
#!/usr/bin/sh
# run vim if:
# - 'vi' command is used and 'vim' binary is available
# - 'vim' command is used
(中略)
if test -f /usr/bin/vim
then
exec /usr/bin/vim "$@"
fi
つまり、vim がインストールされていればそれを起動、無ければ vim-minimal の本体を起動するラッパースクリプトが vi の実体です。`vi –version` を打つと「VIM – Vi IMproved 8.2 … Small version without GUI.」と表示されます。「古典的な vi」ではなく、機能制限版の vim を見ています。
本記事では便宜上 vi と vim を区別なく使います。両方とも同じ操作で動きます。
第2章:モードという概念
vi の最大の特徴であり、最大の挫折ポイントが モードです。Windows のメモ帳や VS Code のようなエディタは「キーを押す=文字が入力される」が常識ですが、vi はキーを押す行為が文脈によって意味を持つ仕様です。
2.1 3つのモード
| モード | 役割 | キーの意味 |
|---|---|---|
| ノーマルモード(起動直後) | 移動・コマンド実行 | ホームポジションのキーがコマンドとして解釈される(h=左、dd=行削除など) |
| インサートモード | 文字入力 | 普通のエディタと同じ。打ったキーがそのまま入力される |
| コマンドラインモード | ファイル操作・検索置換 | : や / で始まるコマンドを画面下部で入力 |
2.2 モード遷移
vi には3つのモードがあり、キー操作でモードを切り替えながら編集します。まずは全体像を図で押さえます。

「困ったら Esc」が合言葉。何か変なキーを押してしまっても、Esc を1〜2回押せばノーマルモードに戻ります。そこから :q! と打てば必ず終了できます。
📖 試験Tipsボックス:3モードの遷移
主題:1.03.5(重要度:高)
出題パターン:「インサートモードに入るキーは?」「ノーマルモードに戻るキーは?」「コマンドラインモードに入る記号は?」
暗記ポイント
- 起動直後はノーマルモード
- ノーマル → インサート:
i(カーソル位置)/a(カーソル直後)/o(次の行)/I(行頭)/A(行末)/O(前の行) - インサート → ノーマル:
Esc - ノーマル → コマンドライン:
:(コマンド)//(前方検索)/?(後方検索) - コマンドライン → ノーマル:
Enter実行 /Esc中止
第3章:最低限の生存セット ── 5コマンドだけ覚える
vi のコマンドは膨大ですが、最初の1週間はこの5つだけで戦えます。
| キー | 意味 |
|---|---|
vi ファイル名 | 起動(ノーマルモードで開く) |
i | インサートモードに入る(=入力開始) |
Esc | ノーマルモードに戻る |
:wq | 保存して終了 |
:q! | 変更を破棄して終了(緊急脱出) |
これだけで「設定ファイルを開いて1行直して保存」ができます。実際にやってみます。linuc-almaで実行:
$ mkdir -p ~/linuc-vim
$ vi ~/linuc-vim/hello.txt
vi が起動し、空のファイルが開かれます(画面下に ~/linuc-vim/hello.txt [新規] のような表示)。ここで i を押してインサートモードに入り、次のように入力:
Hello, vi!
これは私の最初の vi 編集です。
入力が終わったら Esc でノーマルに戻り、:wq と打って Enter。プロンプトに戻ります。
linuc-almaで実行:
$ cat ~/linuc-vim/hello.txt
実行結果:
Hello, vi!
これは私の最初の vi 編集です。
これで 第3章の目標達成です。実務でやる作業の半分以上はこの5コマンドの組み合わせで終わります。
第4章:移動 ── h j k l と仲間
ノーマルモードで使う移動コマンド。矢印キーも使えますが、ホームポジションから手を動かさない hjkl が vi の流儀です。
| キー | 方向 |
|---|---|
h | 左 |
j | 下 |
k | 上 |
l | 右 |
覚え方:j は下に伸びるアルファベット(j の縦棒)/ k は上に伸びる。
4.1 単語・行・ファイル単位の移動
| キー | 動き |
|---|---|
w / b / e | 次の単語先頭 / 前の単語先頭 / 単語末尾 |
0 / $ | 行頭 / 行末 |
^ | インデント無視の先頭文字 |
gg | ファイル先頭 |
G | ファイル末尾 |
NG または :N | N 行目(例:10G または :10 で10行目) |
Ctrl+f / Ctrl+b | 1ページ進む / 戻る |
Ctrl+d / Ctrl+u | 半ページ下 / 半ページ上 |
「100行目を見たい」なら :100 + Enter、「1000行のログの末尾を見たい」なら G、「先頭に戻りたい」なら gg。これだけで巨大ファイルでも瞬時に動けます。
第5章:編集 ── 削除・コピー・貼り付け・取り消し
すべてノーマルモードで実行します。キーストロークは「動詞 + 範囲」の組み合わせとして読むと覚えやすい。
| キー | 動作 |
|---|---|
x | カーソル位置の1文字削除 |
X | カーソル直前の1文字削除 |
dd | カーソル行を削除(同時にクリップボードへ保存される) |
5dd | 5行削除 |
yy | 行をコピー(yank) |
5yy | 5行コピー |
p | カーソル直後に貼り付け |
P | カーソル直前に貼り付け |
u | 取り消し(undo) |
Ctrl+r | 取り消しの取り消し(redo) |
rx | カーソル位置の1文字を x に置換 |
cw | カーソル位置の単語を変更(change word) |
cc | カーソル行全体を変更 |
「動詞 + 範囲」のパターン:d(削除)+ d(行)= dd で行削除、d + w(単語)= dw で単語削除、d + $(行末)= d$ で「カーソルから行末まで」削除。y(yank)も同じパターン。
📖 試験Tipsボックス:基本編集コマンド
主題:1.03.5(重要度:高)
出題パターン:「カーソル行を削除するには?」「コピー操作は?」「取り消しは?」
暗記ポイント
x1文字削除 /dd行削除 /5dd5行削除yyyank(コピー)/p貼り付け(カーソル後) /P貼り付け(前)uアンドゥ /Ctrl+rやり直しrx 1文字置換 /cw単語置換 /cc行置換- 動詞 + 範囲のパターン:
d+w=dw、d+$=d$、y+w=yw
第6章:検索と置換
6.1 検索
ノーマルモードで / または ? を打つとコマンドラインに「/」または「?」が出ます。検索文字列を入力して Enter。
/pattern+ Enter:前方検索(ファイル末尾方向)?pattern+ Enter:後方検索(ファイル先頭方向)n:次のマッチへ移動N:前のマッチへ移動(逆方向)
パターンには第10回で学んだ正規表現が使えます(vim は ERE に近い文法)。/error で「error」を含む箇所、/^# でコメント行、など。
6.2 置換 ── sed と同じ文法
コマンドラインモード(: から始まる)で s コマンドを使います。第10回 sed の s/pat/rep/g とほぼ同じ文法。
| コマンド | 動作 |
|---|---|
:s/old/new/ | カーソル行で最初の old を new に置換 |
:s/old/new/g | カーソル行の全箇所の old を new に置換 |
:%s/old/new/g | ファイル全行・全箇所の old を new に置換 |
:%s/old/new/gc | 確認付き全置換(c = confirm) |
:5,10s/old/new/g | 5〜10行目で全置換(行範囲指定) |
第10回の sed -i 's/old/new/g' と同じ感覚で、vi の中から実行できると理解すると一気に身近になります。
📖 試験Tipsボックス:検索と置換
主題:1.03.5(重要度:高)
出題パターン:「ファイル全体で置換するコマンドは?」「行内全置換は?」「次の検索結果へ移動するキーは?」「確認付きで置換するには?」
暗記ポイント
/pat前方検索 /?pat後方検索 /n次 /N前:s/old/new/行内最初 /:s/old/new/g行内全:%s/old/new/gファイル全 /:%s/old/new/gc確認付き:5,10s/old/new/g行範囲指定- 第10回
sedと同じsコマンド
第7章:保存・終了のバリエーション
| コマンド | 動作 |
|---|---|
:w | 保存(書き出し) |
:w newfile | 別名で保存 |
:q | 終了(変更があると拒否される) |
:wq | 保存して終了 |
:x | 変更がある場合のみ保存して終了 |
ZZ(ノーマル) | :x と同等のショートカット |
:q! | 変更を破棄して終了 |
:e file | 別ファイルを開く(バッファ切替) |
:e! | 現在のファイルを再読み込み(編集を破棄) |
:q で終了しようとすると、変更がある場合は「E37: 最後に変更してから保存していません」と拒否されます。保存して終了なら :wq、破棄して終了なら :q!。
第8章:~/.vimrc で設定を永続化
vi は素のままだと行番号も色付けも無く、現代のエディタに比べて素っ気ない見た目です。~/.vimrc という設定ファイルに数行書くだけで、見た目が一気に整います。
ただし、シンタックスハイライトなどの高度な機能は vim-enhanced パッケージが必要です。AlmaLinux 9 minimal install には未導入なので、dnf install で入れます。
linuc-almaで実行:
$ sudo dnf install -y vim-enhanced
実行結果(末尾のみ):
インストール済み:
vim-common-2:8.2.2637-23.el9_7.3.x86_64
vim-enhanced-2:8.2.2637-23.el9_7.3.x86_64
vim-filesystem-2:8.2.2637-23.el9_7.3.noarch
完了しました!
これで /usr/bin/vim と /usr/bin/vimtutor が使えるようになりました。vi を打つと第1章のラッパースクリプトが /usr/bin/vim を発見し、自動的にフル機能の vim にフォールスルーします。
8.1 おすすめ ~/.vimrc
linuc-almaで実行:
$ cat > ~/.vimrc <<'EOF'
set number " 行番号表示
set ruler " カーソル位置表示
set showcmd " 入力中コマンド表示
set hlsearch " 検索結果ハイライト
set incsearch " インクリメンタル検索
set ignorecase " 検索で大文字小文字を無視
set smartcase " ただし大文字を含むときは区別
set tabstop=4 " タブ幅 4
set expandtab " タブをスペースに展開
syntax on " シンタックスハイライト
EOF
linuc-almaで実行:
$ cat ~/.vimrc
実行結果:
set number " 行番号表示
set ruler " カーソル位置表示
set showcmd " 入力中コマンド表示
set hlsearch " 検索結果ハイライト
set incsearch " インクリメンタル検索
set ignorecase " 検索で大文字小文字を無視
set smartcase " ただし大文字を含むときは区別
set tabstop=4 " タブ幅 4
set expandtab " タブをスペースに展開
syntax on " シンタックスハイライト
この状態で vi ~/linuc-vim/hello.txt を起動すると、左端に行番号、カーソル位置(右下)、検索ハイライトが反映されます。
8.2 一時的な設定
「今だけ行番号を出したい」なら、vim 内で :set number(または短縮形 :se nu)を実行。そのセッション限りで反映されます。:set nonumber または :set nu! で解除。
システム全体に適用したい場合は、/etc/vimrc を編集(root 権限)。ただし通常はユーザーごとの ~/.vimrc で十分です。
📖 試験Tipsボックス:保存・終了と .vimrc
主題:1.03.5(重要度:高)
出題パターン:「保存して終了するコマンドは?」「破棄して終了するコマンドは?」「行番号を常に表示するには?」「シンタックスハイライトを有効にするには?」
暗記ポイント
:w保存 /:q終了 /:wq保存終了 /:q!破棄終了 /ZZ保存終了の短縮- 永続設定:
~/.vimrc(個人)//etc/vimrc(システム全体) set number行番号 /syntax onシンタックスハイライトset tabstop=4タブ幅 /set expandtabタブをスペースにset hlsearch検索ハイライト /set ignorecase大小無視
第9章:vimtutor で練習する
vim には 30分の対話チュートリアルが付属します。vim-enhanced 導入後、vimtutor を起動するだけ。
linuc-almaで実行:
$ vimtutor
vim が起動し、英語版チュートリアルが開きます(日本語版は vimtutor ja)。1日30分、3日続ければ実用レベルに届きます。本記事を読み終わったら、まず vimtutor をやってみてください。
第10章:nano という選択肢
vi が苦手な新人の避難経路として nano があります。「画面下にショートカットが書いてあるモードレスエディタ」で、メモ帳に近い感覚です。
AlmaLinux 9 minimal install には未搭載なので、必要なら sudo dnf install -y nano で導入します。
| nano の操作 | 説明 |
|---|---|
nano file | 起動(既にインサート相当の状態) |
Ctrl+O | 保存(Write Out) |
Ctrl+X | 終了 |
Ctrl+W | 検索(Where is) |
Ctrl+\ | 置換(Replace) |
ただし現場の暗黙ルールでは vi が事実上の標準です。visudo crontab -e git rebase -i などのツールは EDITOR 環境変数で vim を起動する想定が多く、いつか必ず vi に出会います。「両方知った上で vi を選ぶ」のがバランスのよい姿勢です。
第11章:現場での使いどころ
- SSH 設定の1行修正:
sudo vi /etc/ssh/sshd_config→/PermitRootLoginで検索 → 該当行を編集 →:wq→sudo systemctl reload sshd - cron ジョブの追加:
crontab -e(裏で vi が起動)でジョブを書き、:wqで構文チェック後に登録 - sudoers の編集:
sudo visudoで構文チェック付き編集。文法エラーがあれば保存時に弾かれる - 緊急対応の本番ログイン:「設定を1行戻して再起動」が最頻出。vi のモード概念が体に染みていないと焦るため、平時から練習しておく
- YAML(Ansible playbook 等)の編集:インデントが命なので
set listで空白可視化、set expandtabでタブ混入防止 - 自動化スクリプトでの編集:
ex -s -c '%s/old/new/g' -c 'wq' fileで非対話の一括置換(sed -iと同じ用途)
第12章:ヒヤリハット ── :q! を打ち忘れて離れられない
⚠️ vi から脱出できずパニック
新人K君は本番サーバーで /etc/ssh/sshd_config を確認しようと sudo vi /etc/ssh/sshd_config を実行。設定を見終わって終了しようとしましたが、うっかり何かのキーを押して中身が変わってしまったようで、:q が「E37: 最後に変更してから保存していません」で拒否されます。
パニックになった K 君は :wq で保存しようとし、意図しない変更が入った状態の sshd_config が本番に書き込まれてしまいました。直後に systemctl reload sshd していなかったため即時障害は回避できましたが、後日のサーバー再起動で SSH デーモンが起動失敗。コンソール経由で復旧する羽目に。
教訓:
- 変更を加えるつもりがないなら
viではなくviewまたはvi -R(読み取り専用モード)で開く - 変更してしまった場合は必ず
:q!で破棄。:wqで保存しない - 「困ったら Esc → :q!」を体に覚え込ませる。呪文化するくらい繰り返す
- 本番設定変更後は必ず構文チェッカー(
sshd -t、nginx -t、visudo -c)で検証してから reload - SSH 設定を書き換える時は別ターミナルで現セッションを保ったまま新規接続テスト。新規接続が通るまで現セッションを切らない
類似事例:Caps Lock が入った状態で hjkl が大文字になり、HJKL として解釈されて画面がいきなり別の場所にジャンプ ── 何が起きたか分からずパニック。キーボードの状態を常に確認する習慣も意外と重要です。
やってみよう
linuc-alma にログインしている前提で、演習1〜4を順に実行してください。
演習1:vi/vim/nano の正体を確認
which vi vim 2>&1(vim は未導入で no found のはず)rpm -q vim-minimal vim-enhancedfile /usr/bin/vi(シェルスクリプトと表示される)head -20 /usr/bin/vi(中身を確認)vi --version | head -5(VIM 8.2 Small version と出る)which nano 2>&1(minimal install では no found)
演習2:5コマンド戦法(生存セット)
mkdir -p ~/linuc-vimvi ~/linuc-vim/hello.txtで起動iでインサートモード- 「Hello, vi!」と「これは私の最初の vi 編集です。」を入力
Escでノーマルモード:wq+ Enter で保存して終了cat ~/linuc-vim/hello.txtで内容確認
演習3:移動・編集・置換
- 事前にサンプルファイルを作る:
printf 'apple\nbanana\ncherry\ndate\nfig\n' > ~/linuc-vim/sample.txt vi ~/linuc-vim/sample.txtで起動- ノーマルで
gg(先頭行)→j(1行下) ddで2行目(banana)削除uでアンドゥ(banana が戻る)/cherry+ Enter で検索:%s/apple/APPLE/gで全置換:wqで保存終了cat ~/linuc-vim/sample.txtで結果確認
演習4:vim-enhanced 導入と .vimrc
sudo dnf install -y vim-enhancedwhich vim vimtutor(両方表示される)- 本文 8.1 のヒアドキュメントで
~/.vimrcを作成 vi ~/linuc-vim/sample.txtで起動 → 行番号が表示されることを確認 →:qvimtutorで対話チュートリアル起動 → 第1章の冒頭だけ進めて:q!で離脱(本格的にやるのは後で)- クリーンアップ:
mv ~/.vimrc ~/.vimrc.linuc11.bak(既存の .vimrc を保護)sudo dnf remove -y vim-enhancedrm -rf ~/linuc-vimrm -f ~/.vimrc.linuc11.bak(演習用の vimrc を完全削除)
分からないコマンドは man vi や、vim 内で :help(チュートリアル付き)で調べてください。vimtutor を真面目にやると、本記事の8割は身につきます。
理解度チェック
○か×で答えてください。回答と解説は次回冒頭で振り返ります。
- vi を起動した直後はインサートモードである。
:wqは変更を破棄して終了するコマンドである。- ノーマルモードの
ddはカーソル行を削除し、その内容はクリップボードに保持される(pで貼り付け可能)。 :%s/old/new/gはファイル全体で old を new に置換する。- AlmaLinux 9 minimal install の
/usr/bin/viは単独のバイナリで、vim とは別のプログラムである。
解答
- 1. × 起動直後はノーマルモード。インサートに入るには
iなどを押す - 2. ×
:wqは保存して終了。破棄して終了は:q! - 3. ○
ddは削除と同時にバッファに保存。pで貼り付けできる(=「カット&ペースト」相当) - 4. ○
%はファイル全体、sは置換、gは行内全部の意味 - 5. ×
/usr/bin/viはシェルスクリプトラッパー。中身は VIM 8.2 Small version で、vim と実質同じ
次回予告
次回は「ディスク・パーティション・ファイルシステム(fdisk, mkfs, mount, LVM)」です。LinuC 101 シリーズの最終回。サーバーの「ストレージ」を扱います。MBR と GPT の違い、パーティション作成、ファイルシステム作成、マウント、LVM の基礎まで。物理/仮想を問わず、ディスクを増設する場面で必ず必要になる知識です。
LinuC 101 試験対策シリーズ 全12回
- 第1回 Linuxの起動・接続・停止:systemctl・login・shutdownの基本
- 第2回 ブートプロセスの仕組み:BIOS/UEFI → GRUB → systemd の流れ
- 第3回 systemdマスター講座:サービス管理・unitファイル・ターゲット
- 第4回 プロセス管理とハードウェア基礎(ps, top, lsblk, lspci, lsusb)
- 第5回 仮想マシンとコンテナの基礎:KVM・Docker・Podman 入門
- 第6回 パッケージ管理マスター:dnf / apt / rpm / dpkg の実践
- 第7回 ファイル操作の実践:cp, mv, find, リンク, FHS
- 第8回 パーミッション・所有者・特殊権限(SUID/SGID/Sticky)
- 第9回 コマンドライン・リダイレクト・パイプの基礎
- 第10回 テキスト処理の三種の神器:grep / sed / awk + 正規表現
- 第11回 vi/vim 入門:現場で使えるエディタ操作(本記事)
- 第12回 ディスク・パーティション・ファイルシステム(fdisk, mkfs, mount, LVM)
