文字列検索で利用する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.*44xargsとの応用
カレントディレクトリ配下の全てのファイル で aaa という文字列を含む ファイル一覧 を sed に渡し置換する
$ grep -rl "aaa" . | xargs sed -i -e 's/aaa/bbb/g'ハイライトをつけて表示
$ grep --color=always "aaa" test.txt