grepはファイル中の文字列に対して正規表現を使って検索し表示するLinuxコマンドだ。
このページではgrepの基本操作を解説する。Linuxコマンドの中では使用することが多いコマンドだ。
ぜひ、この機会に使い方を理解してしまおう。
目次
- 1 grepコマンドの基本
- 2 grepコマンドの便利なオプションたち
- 2.1 grepコマンドの一覧
- 2.2 -iオプション:大文字と小文字を区別せず検索する
- 2.3 -Eオプション:拡張正規表現で検索を行う
- 2.4 -eオプション:一致処理に指定した正規表現を使う
- 2.5 -vオプション:一致しないものを検索する
- 2.6 -nオプション:検索結果に行番号を表示する
- 2.7 -lオプション:検索結果にファイル名のみ表示する
- 2.8 -hオプション:検索結果にファイル名を表示しない
- 2.9 -oオプション:検索結果に一致した文字を表示する
- 2.10 -Cオプション:検索結果に一致した箇所から前後に指定した行数表示する
- 2.11 -rオプション:ディレクトリ内も検索対象とする
- 2.12 -Lオプション:検索した結果、該当しなったファイルを表示する
- 3 関連するLinuxコマンド
grepコマンドの基本
grepコマンドの基本動作
grepはファイル中の文字列を検索するコマンドだ。使い方は、次のとおりシンプルなものになっている。
$ grep 検索正規表現 ファイル名
grepでファイル内の文字を検索するにはこれだけだ。
例えば、workディレクトリ内のファイルすべての中からaという文字を検索する場合は、次のコマンドだ。
$ grep a work/*
aの文字があるファイルとそれぞれの該当箇所が表示できた。
上記grepコマンドを試すなら下のコマンドをLinux上で実行すればすぐに再現可能だ。以下も同様。
1 2 3 4 5 |
mkdir work echo -e 'Apple\n123\n.git' > work/test01.dat echo -e 'Orange\n230\n.dat' > work/test02.dat echo -e 'Grape\n450\n.cnf' > work/test03.dat grep a work/* |
grepでand(なおかつ)検索する
grepでは2つ以上の条件を設定し、どちらにも当てはまる行を表示する、and(なおかつ)検索ができる。
基本的には、シンプルにパイプで繋げばいい。
$ grep 検索文字列 ファイル名 | grep 検索文字列2
1文の中でのand検索では、次のように正規表現を使う。
$ grep スタートの検索文字列.*終わりの検索文字列 ファイル名
.はなんらかの文字、*は直前の文字の0個以上の繰り返しを表す正規表現だ。
つまり./でなんらかの文字列を表現できる。
2つの条件の両方とも当てはまる行を検出するには、このなんらかの文字列の正規表現を利用して検索する。
workディレクトリ内のファイルすべての中からrではじまってpで終わる部分のある行を検索するには、次の通りだ。
$ grep r.*p work/*
rではじまって、pで終わる部分が表示された。
1 |
grep r.*p work/* |
grepコマンドの便利なオプションたち
grepコマンドの一覧
後から詳細をご紹介するが、まずは一覧で見てみよう。
オプション -i
大文字と小文字を区別せず検索する
オプション -E
拡張正規表現で検索を行う
オプション-e
一致処理に指定した正規表現を使う
オプション-v
一致しないものを検索する
オプション-n
検索結果に行番号を表示する
オプション-l
検索結果にファイル名のみ表示する
オプション-h
検索結果にファイル名を表示しない
オプション-o
検索結果に一致した文字を表示する
オプション-C
検索結果に一致した箇所から前後に指定した行数表示する
オプション-r
ディレクトリ内も検索対象とする
オプション-L
検索した結果、該当しなったファイルを表示する
それでは、詳しく見ていこう。
-iオプション:大文字と小文字を区別せず検索する
grepコマンドに-iオプションをつけると、大文字・小文字を区別せずに検索できる。
$ grep –i 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中から大文字のAと小文字のaが区別なく、aで両方検索できるようみよう。
$ grep –i a work/*
大文字のAと小文字のaが区別なく表示された。
1 |
grep –i a work/* |
-Eオプション:拡張正規表現で検索を行う
2つの条件のどちらかに当てはまっているものを検索するor検索を行うためには、|のor演算子を使うが、そのためには拡張正規表現を使う必要がある。
その拡張席表現をするものが、-Eオプションだ。
$ grep –E 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中から大文字のp、またはeのいずれかを検索できるようにするには、次のコマンドだ。
$ grep –E 'p|e' work/*
p、またはeのいずれかが入力されている行が表示された。
1 |
grep –E 'p|e' work/* |
-eオプション:一致処理に指定した正規表現を使う
-eオプションは一致処理に指定した正規表現を行うオプションだが、実際には、または(or)の検索を行うときに使われる。
$ grep –e 検索正規表現1 –e 検索正規表現2 ファイル名
-eオプションを利用し、workディレクトリ内のファイルすべての中から小文字のp、またはeのいずれかを検索できるようにするには、次のコマンドだ。
$ grep –e p –e e work/*
p、またはeのいずれかが入力されている行が表示された。
1 |
grep –e p –e e work/* |
-vオプション:一致しないものを検索する
-vオプションは一致しないものを検索するときに使うオプションだ。
$ grep –v 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中から1の文字を含まないものを検索できるようにするには、次のコマンドだ。
$ grep -v 1 work/*
すべての1を含まないファイルの中の行が表示された。
1 |
grep -v 1 work/* |
-nオプション:検索結果に行番号を表示する
-nオプションは検索結果に行番号を表示するオプションだ。
$ grep –n 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中からaを検索し結果を行番号と合わせて表示する場合は、次のコマンドだ。
$ grep -n a work/*
aを含んだ行が行番号とともに表示された。
1 |
grep -n a work/* |
-lオプション:検索結果にファイル名のみ表示する
-lオプションは検索した結果にファイル名のみを表示したいときに使うオプションだ。
$ grep –l 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中からaの文字を検索し、ファイル名の表示をするには、次のコマンドだ。
$ grep -l a work/*
aを含むファイルの一覧表が表示された。
1 |
grep -l a work/* |
-hオプション:検索結果にファイル名を表示しない
-hオプションは検索した結果にファイル名を表示したくないときに使うオプションだ。
$ grep –h 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中からhの文字を検索し、ファイル名は表示しない場合は、次のコマンドだ。
$ grep -h a work/*
aを含むファイルがファイル名を表示せず、該当箇所のみ表示された。
grep -h a work/*
ファイル名を表示せず、行番号と該当内容のみ表示する場合は、-nオプションと-hオプションを組み合わせる。
workディレクトリ内のファイルすべての中からaの文字を検索し、行番号とファイル名の表示をするには、次のコマンドだ。
$ grep -nh a work/*
aを含むファイルの一覧表が表示された。
1 |
grep -nh a work/* |
-oオプション:検索結果に一致した文字を表示する
-oオプションは検索した結果、該当しなったファイルを表示するオプションだ。
$ grep –o 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中からpで始まり、eで終わる文字を検索し、該当の文字とともに表示する場合は、次のコマンドだ。
$ grep -o p.*e work/*
pなんとかeの文字を含んだ箇所が、検索にマッチした文字とともに表示された。
1 |
grep -o p.*e work/* |
-Cオプション:検索結果に一致した箇所から前後に指定した行数表示する
-Cオプションは検索した結果に合わせて、前後に指定した行数を表示するオプションだ。
$ grep –C 行数 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中から2の文字を検索し、あわせて、前後に1行ずつ表示する場合は、次のコマンドだ。
$ grep -C 1 2 work/*
2を含んだ行が、前後1行とともに表示された。
1 |
grep -C 1 2 work/* |
-rオプション:ディレクトリ内も検索対象とする
-rオプションはディレクトリ内も検索するときに使うオプションだ。
$ grep –r 検索正規表現 ファイル名
workディレクトリ内のさらに下層のディレクトリ内のファイルすべての中からaの文字を検索するには、次のコマンドだ。
$ grep -r a work/*
workディレクトリ内のさらに下層のディレクトリ内のファイルすべての中からaを含むファイルの一覧表が表示された。
1 2 3 |
mkdir work/temp cp work/* work/temp/ grep -r a work/* |
-Lオプション:検索した結果、該当しなったファイルを表示する
-Lオプションは検索した結果、該当しなったファイルを表示するオプションだ。
$ grep –L 検索正規表現 ファイル名
workディレクトリ内のファイルすべての中からaを検索した結果、該当しなかったファイルを表示する場合は、次のコマンドになる。
$ grep -L a work/*
aを含まなかったファイルが表示された。
1 |
grep -L a work/* |
関連するLinuxコマンド
最後にgrepコマンドに関連して、基本的な検索関係のコマンドも紹介しておく
find
ファイル名やディレクトリ名、更新日付などで検索する。
まとめ
今回は、grepコマンドを使ったファイル検索の方法を解説した。
findコマンドと違って、ファイルの中身を検索対象にしているところがポイントだ。
もう一つのポイントとして、検索文字列はワイルドカードではなく、正規表現で表現するところだ。正規表現はプログラミングする上でも頻繁に使う考え方なので、この機会に把握しておいて頂きたい。
grepは本当に頻繁に使うコマンドなので、自分が使いそうなオプションと共に覚えてしまおう。
https://eng-entrance.com/linux-command-grep#-e
-eオプション
grep –e p –e e work/* で何故「大文字のp、またはe」なのかが分かりません。
いつもご愛読ありがとうございます。
大変失礼いたしました。正しくは「小文字のp、またはe」ですね。
こちら修正させていただきました。
ご指摘ありがとうございました。