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 でペーストできます。つまり dd → p で「行の切り取り&貼り付け」になります。行の順序を入れ替えたいときに使えます。
アンドゥ(取り消し)
| キー | 動作 |
|---|---|
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 -e、visudo、git 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.txt → i → 上記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 で開き、以下の操作を行ってください。
yyで1行目をコピーし、Gでファイル末尾に移動してpでペーストddで2行目(port=8080)を削除uで削除を取り消す: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 で開き、以下の操作を行ってください。
/portと入力して Enter を押し、「port」を検索する:%s/web01/web02/gと入力して Enter を押し、web01をweb02に置換する:wqで保存して終了
実行コマンド:
$ cat /tmp/vi-practice.txt
実行結果:
server_name=web02
port=8080
log_level=info
server_name=web02
web01 が web02 に置換されていれば成功です。
クリーンアップ: 演習で作成したファイルを削除します。
実行コマンド:
$ 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-enhanced を dnf 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 コマンドを活用してください。
理解度チェック
以下の文が正しければ○、間違っていれば×と答えてください。
- vi を起動した直後のモードは挿入モードである
- 挿入モードに入るには
iキーを押す - 挿入モードからノーマルモードに戻るには
Escキーを押す :wqはファイルを保存して vi を終了するコマンドである:q!は変更を保存してから終了するコマンドであるddはカーソル位置の1文字を削除する操作である- vi の
/文字列は、開いているファイル内で文字列を検索する機能である - nano は Minimal Install の AlmaLinux に標準で含まれている
解答
- × ―― vi を起動した直後はノーマルモード。挿入モードではない
- ○ ――
iキーで挿入モードに入る。aやoでも入れる - ○ ――
Escキーでノーマルモードに戻る。迷ったらEsc - ○ ――
w(write)で保存、q(quit)で終了 - × ――
:q!は変更を保存せずに強制終了するコマンド - × ――
ddは現在の行を1行削除する操作。1文字削除はx - ○ ――
/に続けて文字列を入力し Enter で検索。nで次の候補に移動 - × ―― 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回)
- 第4回 Linuxとは何か+環境確認
- 第5回 SSH接続とターミナル操作
- 第6回 ファイルシステムとディレクトリ構造
- 第7回 基本コマンド(ファイル操作)
- 第8回 基本コマンド(テキスト処理・パイプとリダイレクト)
- 第9回 viエディタ(この記事)
- 第10回 ユーザーとグループ管理
- 第11回 パーミッションと所有権
- 第12回 プロセス管理
- 第13回 systemd
- 第14回 シェルスクリプト入門
- 第15回 フェーズ2まとめ演習
フェーズ3: ネットワークとインフラ基盤(第16回〜第27回)
- 第16回 ネットワーク基礎
- 第17回 ネットワーク設定と疎通確認
- 第18回 企業ネットワークの仕組み
- 第19回 パッケージ管理
- 第20回 ファイアウォール(firewalld)
- 第21回 ボンディング/チーミング
- 第22回 VLAN
- 第23回 ログ管理
- 第24回 cron / systemd timer
- 第25回 ストレージ管理(LVM)
- 第26回 シェルスクリプト実践
- 第27回 SSH応用
フェーズ4: サーバー構築と運用(第28回〜第36回)
