どのLinuxサーバーにもほぼ必ずある vi。未経験でも「開く・保存・抜ける」の往復と最小の移動・編集ができれば、緊急のサーバー作業で困りません。最重要のモード概念から、置換や貼り付け崩れ対策などの実務のコツ、最後に1画面チートシートまでを、コピペで動く形でまとめました。
01なぜviを覚えるのか — どのサーバーにもある「保険」
サーバーの中でちょっとした設定ファイルを直す。ログを確認する。そんな作業のたびに、あなたは何かしらのテキストエディタを開くことになります。そして Linux サーバーでほぼ確実に入っているエディタが vi です。使い慣れた nano が入っていない最小構成のサーバーやコンテナは珍しくありません。そういう場面で「viしか無い」となったとき、最低限が使えるかどうかで作業効率と安心感がまるで変わります。
- 最小構成の EC2・コンテナ・組み込み機器など、
nanoが入っていない環境が普通にある - 踏み台(bastion)越しに本番サーバーへ入り、設定ファイルを1行だけ直す、といった緊急作業
git commitやcrontab -eがエディタとして vi を起動してくる(設定次第)- ネットワーク障害の切り分けなど、GUIの無い環境で手を動かさざるを得ない場面
踏み台経由での本番作業をどう安全に設計するかは、踏み台・特権アクセスの設計の記事で解説しています。本記事はその「入った先」で困らないための最小サバイバルに絞ります。
02モードの概念こそ最重要 — ここが「抜けられない」の正体
viが「難しい」「抜けられない」と言われる原因の9割は、このモードという考え方にあります。逆に言えば、ここさえ腹落ちすれば、あとのコマンドは丸暗記でなんとかなります。viには大きく3つのモードがあり、キー操作の意味がモードごとに変わります。
- ノーマルモード:起動直後はここ。キーは「移動」や「削除」などの操作コマンドとして解釈される。文字は入力できない。
- 挿入モード:
iなどで入る。ここで初めてキーがそのまま文字として入力される。画面左下に-- INSERT --と表示される。 - コマンドラインモード:ノーマルで
:(コロン)を押すと画面最下行に:が出て、保存:w・終了:qなどを打てる。/で検索もここ。
i を押してから入力する」と覚えてください。Esc を2〜3回。これで必ずノーマルモードに戻れます。ノーマルが全ての起点で、そこから挿入(i)にもコマンドライン(:)にも行けます。この一本道だけ体に入れておけば事故りません。03開く・保存・抜ける — “抜けられない”をここで卒業
まずは最頻出の往復、「開いて・少し書いて・保存して抜ける」を通しで覚えます。ここだけで緊急作業の大半は足ります。
# ファイルを開く(無ければ新規作成される)
vi memo.txt
# 特定の行番号から開く(例:40行目付近を直したい)
vi +40 /etc/nginx/nginx.conf 開いたらノーマルモードです。文字を入力するには挿入モードへ入ります。目的で使い分けます。
i:カーソルの直前から入力(insert)。まず使うのはこれ。a:カーソルの直後から入力(append)。行末の1文字の後ろに足したい時に便利。o:下に新しい行を作ってそこから入力。O(大文字)は上に新しい行。
入力が終わったら Esc でノーマルモードに戻り、コマンドラインモードで保存・終了します。
:w 保存する(write。まだ開いたまま)
:q 終了する(quit。変更が無い時だけ抜けられる)
:wq 保存して終了(実務で一番使う)
ZZ 保存して終了(コロン不要のショートカット。Zを2回)
:q! 変更を破棄して強制終了(保存せず逃げる)
:x 変更があれば保存して終了(:wq とほぼ同じ) :wq(保存して終了)と :q!(保存せず逃げる)の2つです。「うっかり開いて抜けられない」は、Esc → :q! → Enter で100%解決します。04ユースケース:移動 — 目的の場所へ最短でたどり着く
設定ファイルの「あの行」だけ直したい、という場面がほとんどです。矢印キーでも動けますが、ノーマルモードの移動コマンドを少し覚えると、長いファイルでも一瞬で目的地に着けます。
h j k l 左・下・上・右(矢印キーの代わり。h=左, l=右)
w / b 単語ごとに前へ / 後ろへ
0 / $ 行の先頭 / 行の末尾へ
gg / G ファイルの先頭 / 末尾へジャンプ
:120 120行目へジャンプ(コロン+行番号)
/error 「error」を前方検索(Enterで実行)
n / N 次の検索ヒットへ / 前の検索ヒットへ - 行番号ジャンプ:エラーメッセージに「line 120」と出たら
:120で一発。:set number(後述)で行番号を表示しておくと便利。 - 検索:
/文字列で探し、nで次々に移動。設定ファイルで特定のディレクティブを探すときの主力。 ggで先頭、Gで末尾。ログの最後を見たいときは開いてすぐG。
h j k l がどうしても慣れなければ、最初は矢印キーで問題ありません。ただ :行番号 と /検索 の2つだけは早めに手に馴染ませると、長い設定ファイルの編集が段違いに速くなります。05ユースケース:編集 — 削除・コピー・やり直し
移動できたら、次は削除・コピー・貼り付け・やり直しです。すべてノーマルモードで行います。
x カーソル上の1文字を削除
dd 1行まるごと削除(切り取りも兼ねる)
yy 1行コピー(yank)
p カーソルの後(下の行)に貼り付け
u 直前の操作を取り消す(undo)
Ctrl-r 取り消しをやり直す(redo)
cw 単語を消してそのまま挿入モードへ(change word)
o / O 下 / 上に新しい行を作って挿入モードへ
. 直前の編集操作をもう一度繰り返す viの効率は「数値プレフィックス」で跳ね上がります。コマンドの前に回数を打つと、その回数だけ実行されます。
3dd 3行まとめて削除
5j 5行下へ移動
2yy 2行コピー
d$ カーソルから行末まで削除 - やり直しは怖くない:操作を間違えても
uで戻せます。連打すればどんどん過去に戻れます。行き過ぎたらCtrl-r。 - 1行削除
ddは切り取りでもあります。ddの後にpで「行の移動」ができます。 cwは「単語を打ち直す」定番。誤字を含む単語にカーソルを置いてcw→ 正しい単語を入力 →Esc。
.(ドット)は「直前の編集の繰り返し」です。例えば dd で1行消したあと、別の行で . を押せばそこも1行消えます。同じ修正を何箇所もするとき、これを知っているだけで作業時間が数分の一になります。06ユースケース:置換と実務のハマりどころ
ここからは実務で本当に効く操作です。とくに一括置換と貼り付け崩れ、権限不足で保存できないの3つは、知らないと確実に一度は詰まります。
コマンドラインモードでの一括置換は、設定ファイルの値をまとめて書き換えるときの主力です。
:%s/old/new/g ファイル全体で old を new に置換(g=行内すべて)
:%s/old/new/gc 置換のたびに y/n で確認しながら実行
:10,20s/old/new/g 10〜20行目だけを対象に置換
:set number 行番号を表示する
:set nonumber 行番号を消す 次は「ターミナルにコピペしたら、インデントが階段状にズレて崩れる」問題です。これはviの自動インデントが、貼り付けた各行にもインデントを足してしまうために起きます。
# 貼り付ける「前」にノーマルモードで実行しておく
:set paste
# → 挿入モード(i)に入って貼り付ける。崩れなくなる
# 貼り付けが終わったら元に戻す
:set nopaste :set paste を疑ってください。貼り付け前にこれを打ってから i で挿入モードに入り、貼り付け、終わったら :set nopaste に戻す。この一手間で「なぜか階段状にズレる」から解放されます。最後は「権限のないファイルを直そうとしたら保存できなかった」パターンです。sudo を付けずに vi /etc/hosts を開いてしまい、:w で E212 や read-only と怒られる、あの場面です。
# 開き直さずに、その場で sudo 権限で保存する裏技
:w !sudo tee %
# → パスワードを聞かれたら入力。保存後 :q! で抜ける :w !sudo tee % は「今のバッファの内容を sudo tee に流し込み、%(=今開いているファイル名)へ書き込む」という意味です。開き直す手間が省けます。ただし本来は最初から sudo vi で開くのが素直です。編集対象や権限設計そのものの考え方は踏み台・特権アクセスの設計もあわせてどうぞ。07詰まったら — 諦め方・vi と vim の違い・最小の .vimrc
どうにもならなくなったら、潔く諦めるのも正解です。Esc を数回 → :q! で、変更を捨てて安全に抜けられます。ファイルは編集前のまま残るので、落ち着いてやり直せます。焦って変な操作を重ねるより、一度抜けるほうが安全です。
vi と vim の違い:vim は「Vi IMproved(viの改良版)」で、vi の上位互換です。多くの Linux では vi と打つと実体は vim が起動します。本記事のコマンドはどちらでもそのまま使えます。色付き表示(シンタックスハイライト)や無制限のundoなどは vim の機能です。
毎回同じ設定を打つのが面倒なら、ホームディレクトリに ~/.vimrc を置くと起動時に読み込まれます。まずは負担の少ない最小構成から始めるのがおすすめです。
" ~/.vimrc の最小例(" で始まる行はコメント)
set number " 行番号を表示
syntax on " シンタックスハイライト
set tabstop=4 " タブ幅を4に
set expandtab " タブをスペースに展開
set hlsearch " 検索ヒットを強調
set ruler " 右下に行・桁番号を表示 ~/.vimrc を勝手に書き換えると、他メンバーの操作感が変わってしまいます。個人環境や自分専用のユーザーで試すのが無難です。Linux全般の実務コマンドはLinux実践コマンドリファレンスにまとめています。vi は、AWS CLI や Linux コマンドと並んで「サーバーに入って手を動かす」ための土台です。EMWは派手なテクニックより、こうした基礎を一つずつ確実に積む姿勢を大切にしています。ネットワークやクラウドの土台から学び直したい方はクラウドエンジニアの基礎(TCP/IP)もどうぞ。未経験からでも歓迎です。採用情報・カジュアル面談はこちらから気軽にご連絡ください。
081画面チートシート — 迷ったらここだけ見る
緊急時にこの1枚だけ見れば往復できる、という早見表です。左からカテゴリ・コマンド・意味の順。まずは太字にしたい気持ちを抑えて、上から「モード」と「保存/終了」だけ体に入れてください。
| カテゴリ | コマンド | 意味・使いどころ |
|---|---|---|
| モード | i / a / o | 挿入モードへ(前 / 後 / 下に新規行)。まず i |
| モード | Esc | ノーマルモードに戻る。迷ったら連打 |
| モード | : (コロン) | コマンドラインモードへ(保存・終了・置換) |
| 保存/終了 | :wq / ZZ | 保存して終了(実務で最頻出) |
| 保存/終了 | :w | 保存だけ(開いたまま) |
| 保存/終了 | :q! | 変更を捨てて強制終了(抜けられない時の切り札) |
| 移動 | gg / G | ファイル先頭 / 末尾へ |
| 移動 | :120 | 120行目へジャンプ |
| 移動 | /語 → n | 前方検索 → 次のヒットへ |
| 移動 | 0 / $ | 行頭 / 行末へ |
| 編集 | x / dd | 1文字削除 / 1行削除(切り取り) |
| 編集 | yy / p | 1行コピー / 貼り付け |
| 編集 | u / Ctrl-r | 取り消し / やり直し |
| 編集 | cw / . | 単語を打ち直す / 直前の編集を繰り返す |
| 編集 | 3dd | 数値プレフィックス(例:3行削除) |
| 置換 | :%s/old/new/g | ファイル全体を一括置換 |
| 実務 | :set paste | 貼り付け時のインデント崩れを防ぐ |
| 実務 | :w !sudo tee % | 権限不足でも sudo でその場保存 |
09よくある質問(FAQ)
保存して終了するには?
ノーマルモード(起動直後の状態。迷ったら Esc を押す)で :wq と入力して Enter です。キー1発なら ZZ(大文字Z 2回)でも同じく「保存して終了」になります。
間違って開いてしまい、抜けられません。どうすれば?
まず Esc を2〜3回押してノーマルモードに戻り、変更を保存せず捨ててよいなら :q! と入力して Enter です。これで必ず抜けられます。:q! は「変更を破棄して強制終了」で、ファイルは元のまま残ります。
入力したはずの文字が反映されず、勝手にコマンドが動きます。
ノーマルモードのままキーを打っているためです。文字を入力するには先に i を押して挿入モードに入ります。画面左下に -- INSERT -- と出れば入力できる状態です。入力が終わったら Esc でノーマルに戻します。
vi と vim はどちらを使えばいいですか?
実務ではどちらでも構いません。多くの環境で vi と打つと中身は vim(vi の上位互換)が起動します。本記事のコマンドは vi 相当の最小セットなので、素の vi でも vim でもそのまま通用します。
viやLinux、AWSの「サーバーに入って手を動かす基礎」を、実務の中で一つずつ積み上げたい方へ。EMW(札幌)は未経験・駆け出しの方の伴走も歓迎しています。カジュアル面談から、あなたの現在地に合わせてお話しします。
相談する