文字列検索で利用するgrepコマンドの使い方を解説します。よく活用するオプション、他のコマンドとの合わせ技など紹介します。
書式
grep [オプション] 検索パターン [ファイル...]
基本正規表現と拡張正規表現
基本正規表現(BRE: basic-regexp)
と拡張正規表現(ERE: extended-regexp)
の違いを意識する必要があります。
grepは、デフォルトだと基本正規表現になります。-Eオプション
を利用すると拡張正規表現
で検索できます。
正規表現 | コマンド |
---|---|
基本正規表現 | grep sed |
拡張正規表現 | grep -E egrep sed -r awk |
例えば、a
または b
のいずれかを表す正規表現は a|b
になりますが、これは拡張正規表現でないと利用できません。
利用例
単一ファイルから検索
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.php
と app/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
除外ディレクトリ指定
--exclude-dir
で検索除外するディレクトリを指定できます。
$ grep -nr xxx . --exclude-dir={dist, .nuxt}
コマンド出力結果から検索
コマンド出力結果
から nginx
という文字列を含む行を表示
$ ps -ef|grep "nginx"
複数キーワードのどちらかを含む
( -e
)
コマンド出力結果
から nginx または mysql
という文字列を含む行を表示
$ ps -ef|grep -E "nginx|mysql"
or
$ ps -ef|grep -e "nginx" -e "mysql"
検索キーワードを含まないファイル
( -L
)
-Lオプション
を指定すると 含まない
という条件になります。
$ grep –Lr 検索キーワード ディレクトリ
上記例ですと、該当ディレクトリ配下に存在するファイルから、検索キーワードを含まないファイルを抽出できます。
指定キーワードを除外して検索
( -v
)
-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
)
-lオプション
を指定すると検索結果がファイル名だけになります。
$ grep –l 検索キーワード ディレクトリ
ファイル名を表示しない
( -h
)
-hオプション
を指定すると検索結果にファイル名を表示しなくなります。
$ grep –h 検索キーワード ディレクトリ
大文字小文字区別せずに
( -i
)
test.txtというファイル
で http
という文字列を含む行を 大文字小文字区別せずに検索
して表示
$ grep -i "http" test.txt
前後行も表示
( -B
-A
)
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