grepコマンド(文字列検索)の使い方

文字列検索で利用するgrepコマンドの使い方を解説します。よく活用するオプション、他のコマンドとの合わせ技など紹介します。

書式

grep [オプション] 検索パターン [ファイル...]

基本正規表現と拡張正規表現

基本正規表現(BRE: basic-regexp)拡張正規表現(ERE: extended-regexp) の違いを意識する必要があります。

grepは、 デフォルトだと基本正規表現 になります。 -Eオプション を利用すると 拡張正規表現 で検索できます。

正規表現 コマンド
基本正規表現 grep sed
拡張正規表現 grep -E egrep sed -r awk

参考
Qiita どのUNIXコマンドでも使える正規表現

利用例

単一ファイルから検索

app/Http/Kernel.php というファイルで HttpKernel という文字列を含む行を表示

$ grep "HttpKernel" app/Http/Kernel.php 
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel

複数ファイルから検索

パスを複数指定

app/Http/Kernel.phpapp/Console/Kernel.php から検索

$ grep "app" app/Http/Kernel.php  app/Console/Kernel.php 

ディレクトリ指定

app/Httpというディレクトリ配下の全てのファイルHttpKernel という文字列を含むファイルがあれば、 ファイル名 & 行番号 & 行内容 を表示

$ grep -nr "HttpKernel" app/Http
app/Http/Kernel.php:5:use Illuminate\Foundation\Http\Kernel as HttpKernel;
app/Http/Kernel.php:7:class Kernel extends HttpKernel

コマンド出力結果から検索

コマンド出力結果 から nginx という文字列を含む行を表示

$ ps -ef|grep "nginx"

複数キーワードのどちらかを含む

コマンド出力結果 から nginx または mysql という文字列を含む行を表示

$ ps -ef|grep -E "nginx|mysql"

or

$ ps -ef|grep -e "nginx" -e "mysql"

検索キーワードを含まないファイル

-Lオプション を指定すると 含まない という条件になります。

$ grep –Lr 検索キーワード ディレクトリ

上記例ですと、該当ディレクトリ配下に存在するファイルから、検索キーワードを含まないファイルを抽出できます。

指定キーワードを除外して検索

-vオプション で除外キーワードを指定できます。

$ cat test.txt 
1 aaaa
2 bbbb
3 aaaa
4 cccc
5 dddd
6 @aaaa
$ 
$ grep aaaa test.txt 
1 aaaa
3 aaaa
6 @aaaa
$ 
$ grep aaaa test.txt | grep -v @aaaa
1 aaaa
3 aaaa

ファイル名だけ表示する

-lオプション を指定すると検索結果がファイル名だけになります。

$ grep –l 検索キーワード ディレクトリ

ファイル名を表示しない

-hオプション を指定すると検索結果にファイル名を表示しなくなります。

$ grep –h 検索キーワード ディレクトリ

大文字小文字区別せずに

test.txtというファイルhttp という文字列を含む行を 大文字小文字区別せずに検索 して表示

$ grep -i "http" test.txt 

前後行も表示

test.txtというファイル44 という文字列を含む行と その前後の行 を表示

$ cat test.txt 
1111
2222
3333
4444
5555
6666
7777
$ grep -n -B 2 -A 1 "44" test.txt 
2-2222
3-3333
4:4444
5-5555

固定文字列で検索

正規表現で検索されるので、以下のように全行ヒットしてしまいます。

$ cat test.txt 
3333
44.*44
5555
$ grep ".*" test.txt 
3333
44.*44
5555

エスケープすれば良いのですが、見づらくなります。

$ grep "\.\*" test.txt 
44.*44

-Fオプション を利用すると、固定文字で検索できます。

$ grep -F ".*" test.txt 
44.*44

xargsとの応用

カレントディレクトリ配下の全てのファイルaaa という文字列を含む ファイル一覧sed に渡し置換する

$ grep -rl "aaa"  . | xargs sed -i -e 's/aaa/bbb/g'

ハイライトをつけて表示

$ grep --color=always "aaa" test.txt