本稿では、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'
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
という文字列を検索します。
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
という文字列を検索します。
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
という文字列を検索します。
【参考】