未経験からのフルスタックエンジニア

スキルをつけよう!未経験からフリーランスエンジニアへの成長記録

Linux学習履歴(2)~テキストファイルの中身を見る・viエディタ~

以下の記事の続きです。

atora1992.hatenablog.com

Linuxコマンドライン入門』が日ごとに6日間分別れているので、今回は3日目の内容についてです。

コマンドの備忘録的になってしまうと思いますので、悪しからず。

3日目

テキストファイルの中身を表示する

$ head -n [行数] [テキストファイルのパス]  #テキストファイルの最初から、行数で指定した部分までを表示する(行数を指定しない場合、10行分表示される)

$ tail -n [行数] [テキストファイルのパス]  #テキストファイルの最後から、行数で指定した行数分までを表示する(行数を指定しない場合、最後の10行分表示される)

上記のコマンドで、パスを指定しない場合は、入力が標準入力となるので、他のコマンドと組み合わせて使用可能(パイプ)

$ cat -n パス | head -n 20 | tail -n 10  #パスで指定したファイルの11行目から20行目までを、行番号を付与して表示する

※headで最初から20行目までを指定し、tailで最後から10行分を指定することで、結果11行目から20行目までを指定したことになります

上記では、テキストファイルの一部を取り出して表示しましたが、長いテキストファイルの全てを閲覧するのに便利なのが以下のコマンドです

$ less [テキストファイルのパス] 
$ less -N [テキストファイルのパス]  #"-N"を指定すると、各行の先頭に行番号が付与される
$ less -p文字列 [テキストファイルのパス]  #"-p"で文字列を指定すると、ファイルで文字列を含む行を最初に表示する

このコマンドを使用すると、ページをめくるように1画面ずつ表示できます(ページャ)。

キー 説明
Space 次のページへ進む
b 前のページへ戻る
Enter 1行進む
y 1行戻る
d 半画面進む
w 半画面戻る
g 最初の行に戻る
数字 q 指定した行に移動する
Shift + g 最後の行に移動する

また、lessには検索機能もあります。
"/"を入力後、検索したい文字列をタイプしてEnterを押すだけです。
※小文字・大文字を区別します

同じ文字列をファイル後方に向かって検索するには"N"キー、前に向かって検索するには"Shift + N"を押します。

テキストファイルから必要な行を取り出す

$ grep [検索したい文字列] [ファイルのパス] [ファイルのパス] ...  #ファイル内容のうち、検索したい文字列を含む行を表示する(複数ファイル指定可能)
※ファイルのパスには、ワイルドカードの使用も可能
※検索したい文字列にスペースが含まれる場合、ダブルクォーテーション(シングルクォーテーション)でくくる必要がある
※小文字・大文字を区別する

$ grep -i [検索したい文字列] [ファイルのパス]  #"-i"をつけることで、小文字・大文字の区別なく検索できる
$ grep -v [検索したい文字列] [ファイルのパス]  #"-v"をつけることで引数で指定した文字列を含まない行を表示する
$ grep -h [検索したい文字列] [ファイルのパス]  #"-h"をつけることで複数のファイルを検索した場合の結果に、ファイル名を表示しなくなる
$ grep -e [文字列1] -e [文字列2] ... [ファイルのパス]  #"-e"は検索文字列を指定する形式。複数のOR検索ができる
$ grep [文字列1] [ファイルのパス] | grep [文字列2] | grep ...  #文字列のAND検索ができる

パイプによる他のコマンドとの併用も可能です。

$ cat -n パス | grep [文字列]  #パスで指定したファイル内容のうち、文字列を含む行を、行番号とともに表示する

検索する文字列には正規表現の使用も可能です。

$ grep -v -e '^090' -e '^$' ファイル  #先頭が090から始まらず、空行ではない行を表示する'^$'で空行を示す。"^"は行頭、"$"は行末を表すので、その間に文字を指定しない=空行となる

grepコマンドでは、正規表現に使う特殊文字をそのまま検索するには、エスケープ(\)が必要となります。エスケープ量が増えると検索しにくいので、正規表現を全く使えない検索コマンドがあります。

$ fgrep
$ grep -F

使い方は"grep"と同じですが、正規表現特殊文字かどうかを気にすることなく検索できます。ただし、シェルのワイルドカードを文字として検索するには、ダブルクォーテーション(シングルクォーテーション)でくくる必要があります。

他にも、正規表現での検索を強化したコマンドもあるそうです

$ egrep
$ grep -E

vi エディタの基本操作

基本1

viはターミナル・エミュレータ上で動作するエディタの一つです。
vimはviの上位互換のエディタとなります。
vimがインストールされているシステムでは、基本的にviコマンドでvimが起動するようです。

$ vi [ファイルのパス]  #vimを起動する。複数ファイルを引数で渡せば、同時に開くこともできる(:nで次のファイル、:n!で前のファイルに切り替え可能)
※指定したファイルが存在しない場合、新規に作成します

vimには2つのモードがあります

  1. コマンド・モード(タイプした文字がコマンドとして認識される)
  2. インサート・モード(タイプした文字がそのまま挿入される)

起動時には自動的にコマンド・モードとなります。
インサート・モードにするには、"I"(アイ)キーを押してください。
逆に、インサート・モードからコマンド・モードに戻るには、"esc"(エスケープ)キーを押してください。

編集内容を保存して終了するには以下の手順を踏みます。

  1. コマンド・モードでコロン":"をタイプ
  2. wqとタイプ("w"はファイルの書き込み、"q"は終了コマンドです)
  3. Enterを押す

以上で保存・終了できます。

代表的なコマンド(コマンド・モードです、コロンをタイプする必要はありません)
※小文字・大文字の区別があります

キー 説明
h カーソルを左に1文字ずらす
j カーソルを下に1文字ずらす
k カーソルを上に1文字ずらす
l カーソルを右に1文字ずらす
0(数字) 行頭へ移動する
$ 行末へ移動する
f[文字] 現在行の指定した文字に移動する(行末に向かって検索)
F[文字] 現在行の指定した文字に移動する(行頭に向かって検索)
[数字]G 指定した行番号の行の先頭に移動する
Enter 1行下の先頭の文字に移動する
- 1行上の先頭の文字に移動する
Ctrl + b 前画面にスクロール
Ctrl + f 次画面にスクロール
Ctrl + d 半画面後ろにスクロール
Ctrl + u 半画面前にスクロール
x カーソル位置の文字を削除
X カーソル前の文字を削除
dd 現在行の削除
D カーソル位置から行末までを削除
d0 行の先頭からカーソル位置までを削除
u 前に実行したコマンドを一つずつ遡って取り消す
Ctrl + r 取り消したコマンドをやり直す

※f[文字]、F[文字]実行後、";"を押すことで、繰り返し検索を実行できます。","を押すと逆方向に検索をできます。
※コマンドの前に数値を打つと、その数値分コマンドを繰り返します("3h"とすれば、カーソルを3文字分左にずらします。"2f[文字]"とすれば、検索して見つかった2つ目の候補に移動します)

dコマンドなどを用いて削除した場合、削除した文字列は「バッファ」と呼ばれる領域に入れられます。そのバッファはpコマンドでカーソル位置の後に書き出すことが可能です。

My name is Atora [Y]amada  #[]はカーソル位置
↓  D
My name is Atora[]
↓ 
My name is[]Atora
↓  p
My name is Yamada Atora

前に追加したい場合は、Pコマンドを使用します。
バッファの内容は、新たに削除しない限り残りますので、繰り返し使用できます。

また、y[カーソル移動コマンド]yyコマンド(現在行をバッファに格納する)を用いれば、削除することなく指定した文字列をバッファに格納できます。

Atora Ya[m]ada
Yamada Atora
↓  2yy(カーソル位置から2行分をバッファに格納)、p
Atora Yamada
Atora Yamada
Yamada Atora
Yamada Atora

詳しい内容はvimチュートリアルで確認してください

$ vimtutor

基本2

:r [ファイルのパス]  #カーソル位置に別のファイル内容を読み込む(Tabによる補完機能が使える)
:w  #ファイルの書き出し(ファイルを指定すると、そのファイルに書き出せる)
:[最初の行番号],[最後の行番号] w [ファイルのパス]  #指定した範囲を書き出す
:q   #エディタの終了
:q!  #ファイル変更内容を破棄して強制的に終了

ブックマークを設定して、瞬時に目的の場所まで移動することも可能です

m [a~zのいずれかの文字]  #ブックマークを設定したい位置でこのコマンドを実行する
` [a~zのいずれかの文字]  #ブックマークで設定したアルファベットを入力すると、ブックマーク位置まで移動する

vimでも文字列の検索がlessコマンドと同じように可能です。

vim内で、シェルのコマンドも実行可能です。

:! [シェルのコマンド]  #シェルのコマンドを実行する(実行後Enterでvimに戻れます)
:r! [シェルのコマンド]  #シェルのコマンド実行結果を取り込む

文字列を置換することも可能です。正規表現を利用したり、範囲指定することもできます。

:[範囲]s/[置換前の文字列]/[置換後の文字列]/[オプション][範囲][オプション]は省略可能。その場合、現在行が対象となる
※スペースはいらない
※検索は行単位で行われ、行中ではじめにヒットした文字列のみ置換される
※全ての文字列を確実に置換したい場合は、オプションに"g"をタイプする
※"&"を用いることで、置換前の文字列を代替できる(Linux/& OS/とすれば、置換後の文字列は"Linux OS"となる)

範囲指定の具体例

:%  #ファイル全体
:[開始行番号],[終了行番号]  #行指定する(現在行は"."、最後の行は"$"で表せる)

コマンド・モード、インサート・モードのほかにもモードがあります。
ビジュアル・モードでは、文字列のコピーや移動がより簡単に行えます。
ビジュアル・モードにするには、"v"、"V"、"Ctrl + V"の3つがあります。

  • v: 文字単位の選択が可能
  • V: 行単位の選択が可能
  • Ctrl + V: 矩形の範囲が選択可能

範囲指定が強いので、コピー・削除がしやすいかと思います。

おまけ

コマンド・モードで実行したコマンドの履歴が見れます。
コロン":"をタイプしてから上矢印(もしくはCtrl + P)でコマンド履歴を遡り、下矢印(もしくはCtrl + N)で遡りを戻れます

次の記事へ

atora1992.hatenablog.com