本稿では、Linuxのgrep・egrep・fgrepコマンドの違いを解説します。
- grep
- パターンを基本正規表現(BRE:Basic Regular Expression)として扱う
- egrep
- パターンを拡張正規表現(ERE:Extended Regular Expression)として扱う
- grep -Eと同じ
- fgrep
- パターンを固定文字列として扱うため、文字列をそのまま検索できる(正規表現を認識しない)
- grep -Fと同じ
以下のファイルを使用してそれぞれのコマンドの違いを見ていきます。
$ cat check_file
file
(f|g)ile
'\(f\|g\)ile'
1. grep
grepで使われるBRE(基本正規表現)では{,},(,),|,+,?を通常の文字列として扱います。
そのため、これらのメタ文字をちゃんとメタ文字として扱うには逆にエスケープが必要です。
$ grep -C 0 '(f|g)ile' check_file
(f|g)ile
$ grep -C 0 '\(f\|g\)ile' check_file
file
1つ目の検索のように(,|,)をエスケープしない場合、BREはこれらのメタ文字を通常の文字列として扱うため、(f|g)ileという文字列を検索します。
2つ目の検索のように(,|,)をエスケープすると、BREはこれらをメタ文字として扱うため、メタ文字の意味通りにfileまたはgileという文字列を検索します。
2. egrep
egrepで使われるERE(拡張正規表現)ではメタ文字をそのままメタ文字として扱うため、正規表現を使った検索に向いています。
$ egrep -C 0 '(f|g)ile' check_file
file
$ egrep -C 0 '\(f\|g\)ile' check_file
(f|g)ile
1つ目の検索のように(,|,)をエスケープしない場合、EREはメタ文字の意味通りにfileまたはgileという文字列を検索します。
2つ目の検索のように(,|,)をエスケープすると、EREはこれらのメタ文字を通常の文字列として扱うため、(f|g)ileという文字列を検索します。
3. fgrep
fgrepはメタ文字を認識しないため、直接文字列を検索するのに向いています。
$ fgrep -C 0 '(f|g)ile' check_file
(f|g)ile
$ fgrep -C 0 '\(f\|g\)ile' check_file
'\(f\|g\)ile'
1つ目の検索では、fgrepはメタ文字を通常の文字列として扱うため、(f|g)ileという文字列を検索します。
2つ目の検索では、fgrepは\も通常の文字列として扱うため、\(f\|g\)ileという文字列を検索します。
【参考】