本記事には広告(アフィリエイトリンク)が含まれます。

viエディタの使い方 サバイバル4ステップ入門

Linuxエンジニア養成講座 第9回|全36回・フェーズ2「Linux基礎」の6回目です。
前回までに学んだこと: パイプとリダイレクト、grep・sed・awk によるテキスト処理(第8回)。
今回学ぶこと: vi エディタの基本操作、モードの概念、nano エディタの紹介。

この記事を読み終えると、以下のことができるようになります。

  • vi でファイルを開き、テキストを入力・編集し、保存して終了できる
  • ノーマルモード・挿入モード・コマンドラインモードの3つのモードを理解し、切り替えられる
  • vi でカーソル移動、削除、コピー&ペースト、検索・置換の基本操作ができる
  • 保存せずに終了する方法(:q!)を知っている
  • nano エディタの基本操作を知り、vi との使い分けを判断できる

alma-mainにSSH接続した状態で進めます。以降のコマンドはすべてalma-main上で実行します。

なぜ vi を学ぶのか

「エディタならVSCodeやメモ帳があるのに、なぜわざわざ vi を覚えるのか」と思うかもしれません。答えは明快です。SSHで接続した本番サーバーにはGUIもVSCodeもないからです。

Linuxサーバーは Minimal Install で構築されることが多く、テキストエディタとしては vi(vim-minimal)しか入っていない環境が珍しくありません。設定ファイルの編集、crontab -e による定期実行の設定(第24回で扱います)、visudo による sudo 設定の編集など、vi が起動する場面は日常的にあります。viが使えなければ、サーバーの前で何もできない状況に陥ります。

前回の第8回では「テキストを読む・検索する・加工する」を学びました。今回は「テキストを書く・編集する」方法を学びます。sed -i でも一括置換はできますが、設定ファイルの特定の行を確認しながら対話的に編集するにはエディタが必要です。

まずはこれだけ — vi サバイバル4ステップ

vi は独特な操作体系を持つエディタで、最初は戸惑います。しかし、最低限の操作は4ステップだけです。仕組みの説明は後にして、まず手を動かしてみます。

ステップ1: vi ファイル名 でファイルを開く

実行コマンド:

$ vi /tmp/survival-test.txt

新しいファイルが vi で開かれます。画面の左端に ~(チルダ)が並んでいますが、これは「その行にはまだ何も書かれていない」ことを示す記号です。

ステップ2: i キーを押して挿入モードに入る

キーボードの i を1回押してください。画面の左下に -- INSERT -- と表示されます。この状態になれば、普通のエディタと同じようにキーボードで文字を入力できます。

ステップ3: テキストを入力する

以下のように3行入力してみてください。行の終わりで Enter キーを押して改行します。

Hello vi
This is my first edit.
vi is not scary.

ステップ4: Esc キーを押してから :wq と入力して Enter

Esc キーを押すと、左下の -- INSERT -- が消えます。続けて :wq と入力して Enter キーを押すと、ファイルが保存されて vi が終了します。w は write(書き込み)、q は quit(終了)の意味です。

ファイルが保存されたか確認します。

実行コマンド:

$ cat /tmp/survival-test.txt

実行結果:

Hello vi
This is my first edit.
vi is not scary.

入力した内容が保存されていれば成功です。vi での編集は i → 入力 → Esc:wq の4ステップです。

困ったときの脱出方法: vi の操作中に何が起きているかわからなくなったら、Esc キーを何回か押してから :q! と入力して Enter を押してください。:q! は「変更を保存せずに終了」するコマンドです。何も壊さずに vi から脱出できます。

vi のモードを理解する

サバイバル4ステップで i を押したり Esc を押したりしました。この操作の裏にある仕組みが「モード」です。vi にはメモ帳と違い、「入力するモード」と「操作するモード」が分かれています。普通のエディタはキーを押せばそのまま文字が入力されますが、vi では「今どのモードにいるか」によってキーの意味が変わります。

vi には3つのモードがあります。

ノーマルモード

vi を起動した直後のモードです。このモードではキーボードを押しても文字は入力されません。代わりに、カーソルの移動、行の削除、コピー&ペーストなどの「操作」を行います。vi のホームポジションとなるモードです。

挿入モード

ノーマルモードで i を押すと切り替わるモードです。このモードでは、キーボードで入力した文字がそのまま画面に表示されます。普通のエディタと同じ感覚で文字を入力できます。画面左下に -- INSERT -- と表示されるのが目印です。Esc キーを押すとノーマルモードに戻ります。

コマンドラインモード

ノーマルモードで :(コロン)を押すと切り替わるモードです。画面左下にコロンが表示され、コマンドを入力できます。ファイルの保存(:w)、終了(:q)、検索、置換などを行います。Enter キーでコマンドを実行するとノーマルモードに戻ります。Esc でもノーマルモードに戻れます。

以下は3つのモードの遷移を図にしたものです。

ノーマルモード(起動直後)
  ├── i キー → 挿入モード(テキスト入力)    ※ Esc で戻る
  └── : キー → コマンドラインモード(保存・終了・検索)  ※ Enter / Esc で戻る

ノーマルモードが中心で、i で挿入モードへ、: でコマンドラインモードへ移行します。どちらのモードからも Esc でノーマルモードに戻れます。迷ったら Esc を押す、と覚えてください。

ノーマルモードの基本操作

ノーマルモードでは、キーひとつでカーソル移動や編集操作ができます。練習用のファイルを使って試してみます。

実行コマンド:

$ vi /tmp/survival-test.txt

先ほど作成したファイルが開きます。起動直後はノーマルモードです。

カーソル移動

矢印キーでもカーソルを動かせますが、vi 固有の移動キーも知っておくと便利です。

キー動作
h左に移動
j下に移動
k上に移動
l右に移動
0行頭に移動
$行末に移動
ggファイルの先頭に移動
Gファイルの末尾に移動
数字G指定した行番号に移動(例: 3G で3行目)

hjkl はキーボードのホームポジションに並んでいるため、矢印キーに手を伸ばさずにカーソルを動かせます。最初は矢印キーで構いませんが、hjkl を知っておくと、矢印キーが使えない端末でも操作できます。

数字G は現場で頻繁に使います。設定ファイルの文法エラーで「line 42: syntax error」のようなメッセージが出たとき、42G と打てばその行に一発でジャンプできます。

削除・コピー・ペースト

キー動作
xカーソル位置の1文字を削除
dd現在の行を1行削除
3dd現在の行から3行削除
yy現在の行を1行コピー(ヤンク)
3yy現在の行から3行コピー
pカーソルの下の行にペースト

dd で削除した内容は内部に保持されているため、p でペーストできます。つまり ddp で「行の切り取り&貼り付け」になります。行の順序を入れ替えたいときに使えます。

アンドゥ(取り消し)

キー動作
u直前の操作を取り消す(アンドゥ)
Ctrl+r取り消しを元に戻す(リドゥ)

間違えて行を削除してしまっても、すぐに u を押せば元に戻せます。慌てずに u で対処してください。

操作を試し終わったら :q! で保存せずに終了してください。

挿入モードに入る方法

サバイバル4ステップでは i で挿入モードに入りましたが、i 以外にも入り方があります。

キー動作
iカーソル位置の前に挿入
aカーソル位置の後に挿入
o現在行の下に新しい行を作って挿入
O現在行の上に新しい行を作って挿入
A行末に挿入

最初は i だけで十分です。慣れてきたら o(新しい行を追加して入力)や A(行末に追記)を使い分けると操作が速くなります。どのキーで挿入モードに入っても、Esc を押せばノーマルモードに戻ります。

コマンドラインモードの操作

ノーマルモードで : を押すとコマンドラインモードに入ります。ファイルの保存・終了のほか、検索や置換を行えます。

保存と終了

コマンド動作
:w保存(終了しない)
:q終了(未保存の変更があるとエラー)
:wq保存して終了
:q!変更を保存せずに強制終了
:w ファイル名別の名前で保存

:wq:q! は毎日使うコマンドです。この2つだけは確実に覚えてください。

検索

ノーマルモードで / を押すと、画面左下に / が表示されて検索文字列を入力できます。

操作動作
/検索文字列 + Enter前方(下方向)に検索
n次の検索結果に移動
N前の検索結果に移動

第8回で学んだ grep はファイルの外からテキストを検索するコマンドでした。vi の / は、開いているファイルの中で検索する機能です。設定ファイル内の特定のパラメータを探すときに使います。

置換

コマンドラインモードで置換を実行できます。

コマンド動作
:%s/old/new/gファイル全体の old を new に置換
:s/old/new/現在行の最初の old を new に置換

この構文に見覚えはないでしょうか。第8回で学んだ sed 's/old/new/g' と同じ形式です。sed の置換構文を覚えていれば、vi の置換コマンドもすぐに使えます。% は「ファイル全体」を意味し、g は「各行のすべての一致箇所」を意味します。

行番号の表示

コマンドラインモードで :set number と入力すると、各行の左側に行番号が表示されます。試してみてください。

実行コマンド:

$ vi /etc/passwd

vi が開いたら、:set number と入力して Enter を押します。各行の左側に行番号が表示されます。

  1 root:x:0:0:root:/root:/bin/bash
  2 bin:x:1:1:bin:/bin:/sbin/nologin
  3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
  ...

この状態で :15 と入力して Enter を押すと、15行目にカーソルがジャンプします。エラーメッセージに「line 15: syntax error」のような行番号が表示された場合、この方法で該当行にすぐ移動できます。確認が終わったら :q! で保存せずに終了してください。

行番号があると、他のメンバーに「この設定ファイルの15行目を見てください」と伝えるときにも役立ちます。非表示に戻すには :set nonumber と入力します。

もう一つの選択肢 — nano エディタ

vi のモード操作がどうしても苦手という場合、nano というエディタも選択肢のひとつです。nano は画面下部にショートカットキーの一覧が常に表示されており、モードの概念がないため直感的に操作できます。

ただし、nano は Minimal Install には含まれていません。まずインストールします。

実行コマンド:

$ sudo dnf install nano

確認プロンプトが表示されたら y を入力して Enter を押してください。第7回と同様にパッケージがダウンロードされます。

インストールが完了したら、バージョンを確認します。

実行コマンド:

$ nano --version | head -2

実行結果:

 GNU nano バージョン 5.6.1
 (C) 1999-2011, 2013-2021 Free Software Foundation, Inc.

nano の基本操作は以下の通りです。

操作動作
nano ファイル名ファイルを開く(そのまま入力可能)
Ctrl+O → Enter保存
Ctrl+X終了
Ctrl+K行の削除
Ctrl+W検索

nano にはモードがないため、起動した直後からそのまま文字を入力できます。vi と比べると学習コストは低いです。

では、なぜ nano ではなく vi を優先して覚えるべきなのでしょうか。理由は3つあります。

  • nano が入っていないサーバーは多い: Minimal Install には nano が含まれない。本番サーバーに自由にパッケージを追加できないケースもある
  • vi はどんなサーバーにも入っている: vim-minimal はほとんどのディストリビューションで標準搭載されている
  • vi 起動が前提のコマンドがある: crontab -evisudogit commit などはデフォルトで vi が起動する

nano が使える環境でちょっとした編集をするなら nano も選択肢です。ただし、vi は「使えて当たり前」と見なされる場面が多いため、サバイバル4ステップだけでも身につけておくことを推奨します。

やってみよう — vi で設定ファイルを編集する

ここまで学んだ vi の操作を使って、4つの演習に取り組んでみてください。すべて /tmp ディレクトリの下で作業します。

演習1: ファイルを新規作成して保存する

/tmp/vi-practice.txt を vi で新規作成し、以下の3行を入力して保存してください。

server_name=web01
port=8080
log_level=info

手順: vi /tmp/vi-practice.txti → 上記3行を入力 → Esc:wq

実行コマンド:

$ cat /tmp/vi-practice.txt

実行結果:

server_name=web01
port=8080
log_level=info

演習2: 既存ファイルを確認だけして閉じる

/etc/hostname を vi で開いて内容を確認し、何も変更せずに閉じてください。

手順: vi /etc/hostname → 内容を確認 → :q

何も変更していなければ :q だけで終了できます。もし誤ってキーを押してしまった場合は :q! で終了してください。

演習3: 行の削除・コピー&ペーストを試す

/tmp/vi-practice.txt を再度 vi で開き、以下の操作を行ってください。

  1. yy で1行目をコピーし、G でファイル末尾に移動して p でペースト
  2. dd で2行目(port=8080)を削除
  3. u で削除を取り消す
  4. :wq で保存して終了

実行コマンド:

$ cat /tmp/vi-practice.txt

実行結果:

server_name=web01
port=8080
log_level=info
server_name=web01

末尾に1行目のコピーが追加され、port=8080 の行は u で復元されているはずです。

演習4: 検索と置換を試す

/tmp/vi-practice.txt を vi で開き、以下の操作を行ってください。

  1. /port と入力して Enter を押し、「port」を検索する
  2. :%s/web01/web02/g と入力して Enter を押し、web01web02 に置換する
  3. :wq で保存して終了

実行コマンド:

$ cat /tmp/vi-practice.txt

実行結果:

server_name=web02
port=8080
log_level=info
server_name=web02

web01web02 に置換されていれば成功です。

クリーンアップ: 演習で作成したファイルを削除します。

実行コマンド:

$ rm /tmp/survival-test.txt /tmp/vi-practice.txt

現場のヒヤリハット — 見るだけのつもりが :wq で上書き

ある現場で、本番サーバーの設定ファイルを確認するために vi /etc/httpd/conf/httpd.conf で開いた人がいました。読んでいる途中で無意識にキーを押してしまい、ファイルの一部が変わっていることに気づかないまま :wq で閉じてしまいました。その後 Apache が起動しなくなり、原因の特定に時間がかかりました。

防止策: 設定ファイルを「見るだけ」なら、リードオンリーモードで開いてください。

実行コマンド:

$ vi -R /etc/hostname

または view コマンドでも同じ効果があります。

実行コマンド:

$ view /etc/hostname

リードオンリーモードでは、:wq を実行しても「読み込み専用に設定されています」という警告が出て書き込みが阻止されます。もうひとつの防止策として、第8回で学んだ cp ファイル名 ファイル名.bak で編集前にバックアップを取る習慣も有効です。

vi の仕組みをもう少し知る — vim-minimal と vim-enhanced

第7回vim-enhanceddnf install しました。ここで、vi コマンドの裏側を見てみます。

実行コマンド:

$ file /usr/bin/vi

実行結果:

/usr/bin/vi: a /usr/bin/sh script, ASCII text executable

/usr/bin/vi はバイナリ(実行プログラム)ではなく、シェルスクリプトです。中身を見てみます。

実行コマンド:

$ cat /usr/bin/vi

実行結果:

#!/usr/bin/sh

if test -f /usr/bin/vim
then
  exec /usr/bin/vim "$@"
fi

exec /usr/libexec/vi "$@"

(コメント行は省略しています)

仕組みはこうです。/usr/bin/vim(vim-enhanced のバイナリ)が存在すればそちらを起動し、なければ /usr/libexec/vi(vim-minimal のバイナリ)を起動します。第7回で vim-enhanced をインストールしたため、現在の環境では vi コマンドを実行すると vim-enhanced が動いています。

vim-minimal は機能が制限された「Small version」で、vim-enhanced は構文ハイライトや日本語対応など多くの機能を持つ「Huge version」です。Minimal Install のサーバーには vim-minimal しか入っていないため、構文ハイライトなどは使えませんが、基本的な編集操作はまったく同じです。

自走のヒント — vimtutor と man vim

vi の操作をすべて覚える必要はありません。今日覚えるのは i → 編集 → Esc:wq / :q! の4ステップだけで十分です。それ以外の操作は、必要になったときに調べれば問題ありません。

さらに練習したい場合は、vimtutor という対話型チュートリアルが用意されています。

実行コマンド:

$ which vimtutor

実行結果:

/usr/bin/vimtutor

vimtutor は vim-enhanced をインストールすると利用できるコマンドです。vimtutor と入力して実行すると、vi の操作を順番に練習できるチュートリアルが開きます。LANG=ja_JP.UTF-8 の環境では日本語版が自動的に選ばれます。所要時間は25〜30分程度です。

vi のオプションや機能を調べたいときは man vim を参照してください。

実行コマンド:

$ man vim

man ページには起動オプションや環境変数など、詳細な情報が記載されています。第7回で導入した man コマンドを活用してください。

理解度チェック

以下の文が正しければ○、間違っていれば×と答えてください。

  1. vi を起動した直後のモードは挿入モードである
  2. 挿入モードに入るには i キーを押す
  3. 挿入モードからノーマルモードに戻るには Esc キーを押す
  4. :wq はファイルを保存して vi を終了するコマンドである
  5. :q! は変更を保存してから終了するコマンドである
  6. dd はカーソル位置の1文字を削除する操作である
  7. vi の /文字列 は、開いているファイル内で文字列を検索する機能である
  8. nano は Minimal Install の AlmaLinux に標準で含まれている

解答

  1. × ―― vi を起動した直後はノーマルモード。挿入モードではない
  2. ○ ―― i キーで挿入モードに入る。ao でも入れる
  3. ○ ―― Esc キーでノーマルモードに戻る。迷ったら Esc
  4. ○ ―― w(write)で保存、q(quit)で終了
  5. × ―― :q! は変更を保存せずに強制終了するコマンド
  6. × ―― dd は現在の行を1行削除する操作。1文字削除は x
  7. ○ ―― / に続けて文字列を入力し Enter で検索。n で次の候補に移動
  8. × ―― nano は Minimal Install に含まれない。dnf install nano でインストールが必要

まとめ

今回は vi エディタの基本操作と nano エディタを学びました。

  • vi のサバイバル4ステップ: i(挿入モード)→ テキスト入力 → Esc(ノーマルモード)→ :wq(保存して終了)
  • 困ったときの脱出: Esc:q!(保存せず終了)
  • vi には3つのモードがある: ノーマルモード、挿入モード、コマンドラインモード
  • ノーマルモードでは dd(行削除)、yy(コピー)、p(ペースト)、u(アンドゥ)が使える
  • :%s/old/new/g の置換構文は、第8回で学んだ sed 's/old/new/g' と同じ形式
  • vi は Minimal Install でも使えるが、nano は dnf install nano が必要
  • 設定ファイルを見るだけなら vi -R または view でリードオンリーモードを使う
  • さらに学びたいときは vimtutor(対話型チュートリアル)と man vim を活用する

今回 vi でファイルを編集できるようになりました。次回の第10回「ユーザーとグループ管理」では、/etc/passwd/etc/shadow といった重要な設定ファイルを扱います。第8回/etc/passwd をテキスト処理の題材として使いましたが、各フィールドの意味はまだ学んでいません。次回はその中身を読み解き、ユーザーの作成・管理を行います。vi で設定ファイルを編集するスキルは、次回以降のあらゆる回で必要になります。

シリーズ一覧

フェーズ1: エンジニアのいろは(第1回〜第3回)

フェーズ2: Linux基礎(第4回〜第15回)

フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)

フェーズ4: サーバー構築と運用(第28回〜第36回)