第五章 テキストファイルを使ってみよう
Linuxのほとんどの設定は、プレーンテキストファイルを編集することで行われるんだ。/etc ディレクトリのファイルを編集してローカルサービスを設定するのも、Ansible ディレクトリのファイルを編集してホストの構成を管理するのも、テキストファイルは今でもあらゆるタスクで使われているよ。
5.1 vim と vi でファイルを編集する
vim は vi の改良版で、使い方はだいたい同じだけど、vim にはガイドやコードハイライトなんかがあるから、基本的には vim を使うのがおすすめ。
実際、一部の Linux ディストリビューションでは vi が vim のエイリアスになっていて、alias vi と打つと alias vi = 'vim' って表示されることもあるんだ。でも、root ユーザーだとエイリアスが設定されていないことも多いよ。
ちなみに Linux には他にもテキストエディタがあって、nano、gedit、jed、joe、kate、kedit、mcedit、nedit なんかがある。CUI で動くプレーンテキスト用だと jed や joe も有名だね。
5.1.1 vi を使い始める
vi には3つのモードがあるんだ。主なのは コマンドモード と 挿入モード、それと ex モードだね。ファイルを開いた直後(vi file を実行した後)は、デフォルトでコマンドモードになっているよ。
コマンドモードは、テキストを変更する前に「何をしたいか」を伝えるコマンド(1〜2文字のアルファベットや数字)を入力するモードなんだ。
注意:コマンドは大文字と小文字を区別するから気をつけてね。
- テキストの追加
挿入モード に入るには、以下の「入力」コマンドのどれかを打つんだ。
| コマンド | 説明 |
|---|---|
| a | 追加。カーソルの右側にテキストを入力する |
| A | 行末に追加。現在の行の最後に移動して入力を始める |
| i | 挿入。カーソルの左側にテキストを入力する |
| I | 行頭に挿入。現在の行の最初に移動して入力を始める |
| o | 下に開く。現在の行の下に新しい行を作って挿入モードになる |
| O | 上に開く。現在の行の上に新しい行を作って挿入モードになる |
挿入モードに入ると、画面の左下に --INSERT-- って表示されるよ。
入力が終わったら、Esc キーを押してコマンドモードに戻ろう(たまに2回押す必要があるけど、とりあえず Esc を押せば大丈夫)。
- テキスト内の移動
1文字ずつ移動するときは以下のキーを使うよ。
| キー | 説明 |
|---|---|
| 矢印キー | 上下左右 |
| h, j, k, l | 左、下、上、右 |
| Backspace, Space | 左、右 |
もっと大きく移動するコマンドはこちら。
| コマンド | 説明 |
|---|---|
| w | 次の単語の先頭に移動(スペース、タブ、記号区切り) |
| W | 次の単語の先頭に移動(スペース、タブ区切り) |
| b | 前の単語の先頭に移動(スペース、タブ、記号区切り) |
| B | 前の単語の先頭に移動(スペース、タブ区切り) |
| 0 (ゼロ) | 行頭に移動 |
| $ | 行末に移動 |
| H | 画面の一番上の行に移動 |
| M | 画面の中央の行の先頭に移動 |
| L | 画面の一番下の行に移動 |
- テキストの削除、コピー、変更
これらのコマンドは、移動キー(矢印や PgUp、PgDn、アルファベットなど)や数字と組み合わせて、「何を」削除・コピー・変更するかを正確に指定できるんだ。
| コマンド | 説明 |
|---|---|
| x | カーソル位置の文字を削除 |
| X | カーソルの前の文字を削除 |
| d | テキストを削除 |
| c | テキストを変更 |
| y | テキストをコピー(ヤンク) |
表の中の <?> には移動コマンドが入るよ。例えば:
- dw — カーソル位置から単語の終わりまで削除
- db — カーソル位置から単語の始まりまで削除
- dd — 行全体を削除
- c$ — カーソル位置から行末まで削除して挿入モードへ(要は書き換え)
- c0 — カーソル位置から行頭まで削除して挿入モードへ
- cl — カーソル位置の1文字を削除して挿入モードへ
- cc — 行全体を削除して挿入モードへ
- yy — 行全体をバッファにコピー
- y) — カーソル位置から文の終わりまでコピー
- y} — カーソル位置から段落の終わりまでコピー
数字を使ってコマンドを繰り返すこともできるよ。
- 3dd — カーソル行から3行削除
- 3dw — 次の3つの単語を削除
- 5cl — 次の5文字を変更(削除して挿入モードへ)
- 12j — 12行下に移動
- 5cw — 次の5単語を削除して挿入モードへ
- 4y) — 次の4文をコピー
- テキストの貼り付け(ペースト)
バッファに保存された最新のテキストをファイルに戻すコマンドだよ。
| コマンド | 説明 |
|---|---|
| P | カーソルの左側(行単位なら上の行)に貼り付け |
| p | カーソルの右側(行単位なら下の行)に貼り付け |
- コマンドの繰り返し
削除や変更、貼り付けをした後、. を押すと同じ操作を繰り返せるんだ。例えば、単語 Joe を Jim に書き換えた(cw)後、次の場所を探して . を押せば同じように書き換えられるよ。
- vi を終了する
コマンドモードで ZZ と打てば保存して終了できる。または : を押して ex モードに入ってから操作するよ。
| コマンド | 説明 |
|---|---|
| :w | 保存する(終了しない) |
| :wq | 保存して終了(ZZ と同じ) |
| :q | 終了する(変更がない場合のみ) |
| :q! | 強制終了(変更を保存しない) |
- その他のコマンド
- u — 操作を取り消す(Undo)
- Ctrl+R — 取り消しを取り消す(Redo)
- :!command –
:!の後に shell コマンドを打つと、直接実行できる。例えば:!dateで日付を確認したり。:!bashで新しいシェルを起動もできるけど、戻るのを忘れないように保存してからやるのがおすすめ。 - Ctrl+g — ファイル名、現在の行番号、総行数、パーセンテージ、列番号を表示する。
5.1.2 ファイル内をジャンプする
ファイルが長いときは、こっちの移動方法が便利だよ。
| コマンド | 説明 |
|---|---|
| Ctrl+f | 1ページ進む |
| Ctrl+b | 1ページ戻る |
| Ctrl+d | 半ページ進む |
| Ctrl+u | 半ページ戻る |
| G | ファイルの最後の行へ移動 |
| nG | n 行目へ移動(数字を指定) |
5.1.3 テキストを検索する
/ や ? を使って、前方や後方にテキストを検索できる。メタ文字も使えるよ。
- /hello* — hello で始まる行を前方に検索
- ?[pP]rint — print または Print という単語を後方に検索
検索結果が出た後、n(次へ)や N(前へ)で同じ方向や逆方向に続けて検索できるよ。
5.1.4 ex モードを活用する
vi エディタはもともと ex エディタがベースになっているんだ。ex モードを使うと、1行または複数行のテキストをまとめて検索して変更できるよ。
コマンドモードで : を入力して ex モードに入る。
- :g/Local — “Local” という単語を検索して、該当する行を表示する。
- :s/Local/Remote — 現在の行で最初に見つかった “Local” を “Remote” に置換する。
- :g/Local/s//Remote — 各行の最初に見つかった “Local” をすべて “Remote” に置換する。
- :g/Local/s//Remote/g — ファイル内のすべての “Local” を “Remote” に置換する。
- :g/Local/s//Remote/gp — すべて置換して、その結果の行を表示する。
5.1.5 もっと詳しく知りたいなら
vimtutor コマンドを打つと、vim の中でチュートリアルが始まるよ。これが一番の近道かも。
5.2 ファイルを探す
システム内のファイルを見つけるための便利なコマンドがいくつかあるよ。
- locate — 名前でファイルを探す
- find — いろんな属性でファイルを探す
- grep — ファイルの中身(テキスト)を検索する
5.2.1 locate コマンドで名前から探す
ほとんどの Linux システムでは、毎日1回 updatedb コマンドが走って、ファイル名のリストをデータベースに保存しているんだ。locate はそのデータベースを検索するからめちゃくちゃ速い。データベースを手動で更新したいときは sudo updatedb を使おう。ただし、自分がアクセス権を持っているファイルしか表示されないからね。
使い方は locate [検索文字列]。大文字小文字を無視したいときは -i を付けて locate -i [検索文字列]。例えば、名前に “yexca” が含まれるディレクトリを大文字小文字問わず探すなら locate -i yexca だね。
注意:すべてのファイルがデータベースにあるわけじゃないよ。/etc/updatedb.conf で設定された除外リストにあるファイルは検索に引っかからないんだ。
5.2.2 find コマンドでファイルを検索する
find コマンドは、ファイルシステム内を検索する最強のコマンドだよ。所有者、サイズ、更新日時などの属性(メタデータ)で探せるし、見つけた後にそのまま別のコマンドを実行させることもできる。
注:ファイルメタデータには、所有者、グループ、タイムスタンプ、サイズ、権限、inode情報なんかが含まれているよ。
find と locate の違い
findは実際にファイルシステムをスキャンするからlocateよりは遅い。でも、今さっき作ったばかりのファイル(まだデータベースに載っていないもの)も見つけられる。検索範囲を絞るために、開始ディレクトリを指定するのがコツだよ。
find には特別なオプション -ls があって、ls -l みたいに詳細情報を表示してくれるんだ。
注:一般ユーザーで検索すると権限エラーがたくさん出ることがあるから、エラーを無視したいときはコマンドの最後に 2>/dev/null を付けよう。
- ファイル名で探す
-name や -iname(大文字小文字無視)を使う。ワイルドカード(* や ?)も使えるよ。
| |
これで /etc 以下の “passwd” を含むファイルを全部探せる(ディレクトリを指定しないとカレントディレクトリが対象になるよ)。
-type f(ファイルのみ)や -type d(ディレクトリのみ)で絞り込むのもよく使う手だね。
- ファイルサイズで探す
-size オプションに + や - を付けて範囲を指定する。例えば find /etc -size +10M は 10MB より大きいファイルを探す。
| |
これは /bigdata 以下の 500MB〜5GB のファイルを探して、それぞれのサイズを表示する例だよ。
- ユーザーで探す
-user や -group を使う。-not(〜以外)や -or(または)も組み合わせられる。
| |
これは /home 以下の yexca か lemon が持っているファイルを表示する。
- 権限で探す
-perm オプションを使う。数字の前に - を付けると指定したビットがすべて立っているもの、+(あるいは /)はどれか1つでも立っているもの、何も付けないと完全一致を探すよ。
例えば find -perm /002 は、「その他(Others)」に書き込み権限があるファイルを探すときに便利。
- 日時で探す
time 系のオプション(-atime, -ctime, -mtime)は「日数」、min 系(-amin, -cmin, -mmin)は「分数」で探せる。
数値の前に - を付けるとその時間以内、+ はそれより前(もっと昔)、何も付けないとぴったりその時間、という意味になるよ。
- 10分以内に変更されたものを探す:
| |
- 3日以内に権限が変更されたものを探す:
| |
- 300日以上アクセスされていないファイルを探す:
| |
- ’not’ や ‘or’ を組み合わせる
もっと細かく絞り込みたいときに。
- yexca が所有しているけど、yexca グループじゃないファイルを探す:
| |
- yexca が所有していて、かつ 1GB 以上のファイルを探す:
| |
- 見つけたファイルに対してコマンドを実行する
-exec を使うと見つかったファイルすべてに自動でコマンドを実行できる。確認しながらやりたいときは -ok を使おう。構文はどっちも同じ。
| |
{} が見つかったファイル名に置き換わるよ。コマンドの最後には必ず \; を付けるのがルール。例えば:
| |
これは名前が passwd のファイルを見つけるたびに “I found ファイル名” と表示する。
もっと詳しく知りたいときは man find を見てみてね。
5.2.3 grep コマンドでファイル内を検索する
ファイルの中に特定の文字列が含まれているか探したいときは grep の出番。該当する行を表示したり、ファイル名だけ表示したりできるよ。パイプでつないで標準出力を検索するのにもよく使われるね。
| オプション | 説明 |
|---|---|
| -i | 大文字小文字を無視する |
| -v | 指定した文字列を含まない行を探す |
| -r | ディレクトリ内を再帰的に検索する |
| -l | 文字列が含まれるファイル名だけを表示する |
| –color | 見つかった部分に色を付ける(デフォルトは赤) |
- /etc/sysconfig 以下のファイルから “root” という文字を再帰的に探す:
| |
- 標準出力から “inet” を含む行だけ抜き出す:
| |