↓ メインコンテンツへスキップ

Vim 実践練習|fstab 編集編

·4396 文字·9 分
わて
著者
わて

この記事はviの実践的な内容としてfstabを編集するときに使うコマンドを紹介します。超基本的なモードの変換やカーソルの移動は含みません。

vim は文法的な概念があるので、暗記するのではなく手を動かしながら練習するのが素早く習得するコツです。(英語やプログラミングと同じですね)

vim は少ない手数で編集ができるため使いこなせるとスマートですし、編集時間も爆速になります。

ぜひ実際に手を動かしながら練習してみましょう!

fstab 編集で使うコマンド
#

ディスクを永続的にマウントする際はfstab を編集すると思います。これはvi の良い練習材料です。

完成形
#

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

# この状態から↓

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0
# ここを追加↓
UUID=b411dc99-f0a0-4c87-9e05-184977be8539 /data ext4 defaults                                           0      2

やること
#

  1. 既存のコマンドをコピペ
  2. blkid をファイル内で表示
  3. UUIDとマウントポイントを指定

実践
#

それでは編集していきましょう。

sudo vim /etc/fstab

コピペするまで
#

ディスクを追加する指示を書く際は、既存のものを使いまわしたいので、コピペをしたいと思います。

ちなみに、vim ではコピーのことをヤンクと言います。理由は知りません笑

/ → 検索で移動
#

まずはヤンクしたい箇所までカーソルを移動させます。
j などを使って移動してもよいのですが、検索でジャンプしてしまうのも手です。

/を使えばファイル内の文字検索と移動ができます。/の後に検索したい文字を入力しエンターを押すと実際にカーソルが移動します。
今回はext4で検索すると楽だと思います。

またext4という文字が複数ある場合は、エンター押下後、nで次の該当文字にジャンプできます。さらに、Nで一つ前のものに戻れます。

#                                               ↓ここにカーソル
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

yy → 一行ヤンク(コピー)
#

vim ではコピーのことをヤンクと言います。そして、yyで現在の行全体をヤンクできます。

# 一行まるごとヤンク ↓
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

G → 一番下に移動
#

個人的に手書きのfstabはファイルの下に配置したいので、shift + gでファイルの一番下の行まで行きます。

o → 一行追加
#

このままペーストでも良いのですが、一行くらい開けた方が見やすいので、oで行を追加しときます。
インサートになっちゃうのでEscでノーマルに戻ります。

p → ペースト
#

pでペーストがです。覚えやすいですね

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

# ペーストされた ↓
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

ここまでのまとめ
#

  • / → 検索で移動
  • yy → 一行ヤンク(コピー)
  • G → 一番下に移動
  • o → 一行追加
  • p → ペースト

UUIDとマウントポイント設定まで
#

コピペができたら、実際にUUIDの値とマウントポイントを指定します。
ファイル内でLinuxコマンドを打ったり、" " で囲われた文字のヤンクをしていきます。

.! → で コマンド打つ
#

! を二回押すと、ファイル内でLinux のコマンドをそのまま表示することができます。
出力は現在のカーソルの位置に挿入されるので、あらかじめ何行か下に行を設けておいて行うのがおすすめです。

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

# 出力結果(例) ↓
/dev/sda1: UUID="b04e638c-512a-48f3-9016-52c48a39d264″ TYPE="ext4″
/dev/sdb1: UUID="33a99478-d28e-458f-9e62-5d79a28bdb32″ TYPE="ext4″
/dev/sdc1: UUID="4aabe074-29a9-49e4-9313-5bd55bd91579″ TYPE="ext4″


# 入力中のコマンドは画面最下部に表示される ↓
.!lsblk

f" → " まで移動
#

マウントしたいディスクが記載された行にカーソルをj などをつかって移動します。

UUIDの " " 内の値をヤンクしたいので、まずは " のある位置まで移動します。

fコマンドでは行内での移動ができます。faなら a 、fbなら b、fcなら c の位置まで、カーソルが移動します。

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

/dev/sda1: UUID="b04e638c-512a-48f3-9016-52c48a39d264″ TYPE="ext4″
#               ↓ここまでカーソル移動
/dev/sdb1: UUID="33a99478-d28e-458f-9e62-5d79a28bdb32″ TYPE="ext4″
/dev/sdc1: UUID="4aabe074-29a9-49e4-9313-5bd55bd91579″ TYPE="ext4″

ちなみに、行内に複数同じ文字があるときは;を使えば、次の一致する文字までカーソルが移動します。一つ戻りたいときは,です。

yi" または di" → " " 内だけをヤンク yi"
#

UUIDは " " に囲われています。欲しい値はその中身で、" " は不要です。そんなとき便利なのがiコマンドです。
言語の形容詞や副詞みたいな働きをします。

yi"と打つと、" " で囲われた値を全てヤンクします。
di[なら [ ] で囲われた値をカットします。

プログラミングをしていると ( ) や{ } がたくさん出てくるので、i コマンドはとても便利です。

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

/dev/sda1: UUID="b04e638c-512a-48f3-9016-52c48a39d264″ TYPE="ext4″
#                ↓       " " の内部だけヤンク        ↓
/dev/sdb1: UUID="33a99478-d28e-458f-9e62-5d79a28bdb32″ TYPE="ext4″
/dev/sdc1: UUID="4aabe074-29a9-49e4-9313-5bd55bd91579″ TYPE="ext4″

iの代わりにaを使う事もできます。このとき、" " や括弧も含んだ処理が走ります。

va( → ( ) も含んで選択
ca' → ’ ’ も含んで文字を消しながらインサートモード

? → 上方向検索で移動
#

UUIDがヤンクできたので、先ほどペーストした場所まで戻ります。
?コマンドは/の逆方向の検索ができます。

?ext4, ?xfsなどとして上にある文字列までカーソルを移動させます。

あとは2Bなどを使って入れ替えたいUUIDにカーソルを合わせます。

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

#                                               ↓ここまで移動
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

/dev/sda1: UUID="b04e638c-512a-48f3-9016-52c48a39d264″ TYPE="ext4″
/dev/sdb1: UUID="33a99478-d28e-458f-9e62-5d79a28bdb32″ TYPE="ext4″
/dev/sdc1: UUID="4aabe074-29a9-49e4-9313-5bd55bd91579″ TYPE="ext4″

vE → - を含む文字を一単語として選択
#

ヤンクしたUUIDをペーストしにかかるのですが、今書いてあるUUIDに上書きするようにペーストすると早いです。

vを押すとビジュアルモードになり、文字の選択が可能です。その状態でvを押すと - などを含む文字を一気に選択できます。

この状態でノーマルモードにもどり、pでペーストすればUUIDを上書きできます。

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

#    ↓        UUIDをペースト(上書き)    ↓
UUID=33a99478-d28e-458f-9e62-5d79a28bdb32 /     ext4 defaults                                           0      1

/dev/sda1: UUID="b04e638c-512a-48f3-9016-52c48a39d264″ TYPE="ext4″
/dev/sdb1: UUID="33a99478-d28e-458f-9e62-5d79a28bdb32″ TYPE="ext4″
/dev/sdc1: UUID="4aabe074-29a9-49e4-9313-5bd55bd91579″ TYPE="ext4″

eを押すと - などの文字が含まれているとその手前までで一単語として認識されます。

#    ↓      ↓ e だとこの範囲しか選択されない
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

しかし、shift + eのようにすると、次のスペースまでカーソルを動かせます。

#    ↓                                  ↓ E だとここまで選択される
UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1

a → で文字の右側にインサート
#

UUID はペーストできたので、マウントポイントを定めます。

次の / の位置まで移動するのですが、現在のカーソル位置からならwで移動できます。
その後、aで / の後ろにマウントポイントを指定します。今回はdataとします。

UUID=0a3407de-014b-458b-b5c1-848e92a327a3 /     ext4 defaults                                           0      1
UUID=CBB6-24F2                            /boot vfat defaults,nodev,nosuid,noexec,fmask=0177,dmask=0077 0      2
UUID=f9fe0b69-a280-415d-a03a-a32752370dee none  swap defaults                                           0      0

#                                         ↓ここに追加
UUID=33a99478-d28e-458f-9e62-5d79a28bdb32 /data     ext4 defaults                                           0      1

/dev/sda1: UUID="b04e638c-512a-48f3-9016-52c48a39d264″ TYPE="ext4″
/dev/sdb1: UUID="33a99478-d28e-458f-9e62-5d79a28bdb32″ TYPE="ext4″
/dev/sdc1: UUID="4aabe074-29a9-49e4-9313-5bd55bd91579″ TYPE="ext4″

10dd でblkidの残骸を削除
#

UUIDとマウントポイントを指定できたので、あとは不要な文字を消していきます。
/devなどとしてジャンプし、10ddで10行カットします。

ddコマンドは現在の行をまるまるカットするコマンドです。頭に数字を追加すれば、その回数だけ繰り返されるので適当に10としてます。

10で足りなかったら、.(ピリオド)で繰り返します。
.(ピリオド)はvi の最強のコマンドで、「一つ前と同じことをする」というものです。

ここまでのまとめ
#

  • .! → で コマンド打つ
  • f" → " まで移動
  • yi" または di" → " " 内だけをヤンク yi"
  • ? → 上方向検索で移動 (/ の逆)
  • vE → - を含む文字を一単語として選択
  • a → で文字の右側にインサート
  • 10dd でdd を10回文

合わせて知りたいこと
#

文法さえ分かればやったことのないコマンドでも案外正しく指示できたりします。

以下、雑なメモみたいな書き方ですが、参考までに

二回繰り返すと一行分の処理
#

  • y ヤンク → yy 一行ヤンク
  • d カット → dd 一行カット
  • s 一文字消してインサートモード → ss 一行消してインサートモード
  • c 指定した範囲の文字を消してインサートモード → cc 一行消してインサートモード

動詞→目的語の順
#

動きがあるコマンドとその対象範囲を指定した実行が可能です。

  • yw 一単語ヤンク
  • cw 一単語消してインサートモード
  • ve 単語の最後まで選択
  • di( ( ) のなかをカット

shiftで逆方向または全部感
#

逆方向の例

  • gg 一番上の行に移動 → G 一番下の行に移動
  • n / の検索で次の文字に移動 → N / の検索で前の文字に移動
  • f 行内の右側の文字を検索 → F 行内の左側の文字を検索
  • o 下に行を追加してインサート → O 上に行を追加してインサート

全部間を出す例

  • e 単語の末尾に移動 → E 単語内に - が含まれていても一つの単語として認識して末尾に移動
  • WやBも同様
  • v ビジュアルモードに入る → V 一行全てを選択してビジュアルモードに入る