LinuxにおけるGrep、Egrep、Fgrepの違いは何ですか?
Unix系システムの著名な検索ツールの一つで、ファイルやファイル内の行、または複数の行を検索するために使用できるのはgrepユーティリティです。それは、文字列パターンや正規表現パターン、またはPerlベースの正規表現など、サポートされている多数のオプションに起因する非常に広範な機能を持っています。
その機能の多様性により、grep、egrep(拡張GREP)、fgrep(固定GREP)、pgrep(プロセスGREP)、rgrep(再帰的GREP)など、多くのバリエーションがあります。しかし、これらのバリエーションは元のgrepとの差異がわずかであり、それが様々なLinuxプログラマーに特定のタスクのために使われる理由となっています。
調査すべき主なことは、Linuxユーザーが要件に応じてどのバージョンを選ぶかを決定する、grepの3つの主要なバリアント、すなわち‘grep’、‘egrep’、‘fgrep’の違いが何であるかです。
grepの特別なメタキャラクターのいくつか
+– 前の文字が1回以上出現することを表します。?– これは前の文字のほぼ1回の繰り返しを表します。例としては、a?は ‘a’ または ‘aa’ にマッチします。- ( - 交互表現の開始。
)– 繰り返し表現の終わり。- | – または'|'で区切られたいずれかの式に一致する。例えば、「(a|b)cde」は、'abcde'または'bbcde'のいずれかに一致します。
- { – このメタキャラクターは範囲指定子の開始を示します。例:『a{2}』はファイル内で『aa』に一致します。つまり、aが2回繰り返されることを意味します。
- このメタキャラクターは範囲指定の終了を示します。
grep、egrep、およびfgrepの違い
grep、egrep、fgrepの主な違いは、以下のように強調できます。この一連の例では、操作が行われているファイルが次のものであると仮定しています:
grepコマンド
grep(グローバル正規表現プリント)は、Unix系システムの主要な検索プログラムで、任意のファイルやファイルのリスト、さらには任意のコマンドの出力の中で任意のタイプの文字列を検索できます。
提案された読書: Linux grepコマンドの12の実用的な例
それは、通常の文字列とは別に、基本的な正規表現を検索パターンとして使用します。基本的な正規表現(BRE)では、メタキャラクター(例:'{','}'、'(',')'、'|'、'+'、'?')はその意味を失い、文字列の通常の文字として扱われ、特別な文字として扱われる必要がある場合はエスケープする必要があります。
おすすめの読み物: 文字クラスとブラケット式に関する11の高度な'grep'コマンド
また、grepは任意の文字列や正規表現を高速に検索するためにボイヤー-ムーアアルゴリズムを使用します。
$ grep -C 0 '(f|g)ile' check_file
grep -C 0 '\(f\|g\)ile' check_file
ここでは、コマンドが特殊文字の'(' ')'と'|'をエスケープせずに実行されると、ファイル内で完全な文字列、つまり“(f|g)ile ”を検索します。しかし、特殊文字がエスケープされると、それらを文字列の一部として扱うのではなく、grepはそれらをメタキャラクターとして扱い、ファイル内で“file ”または“gile ”という単語を検索しました。
Egrepコマンド
Egrep または grep -Eは、grep の別のバージョンまたは拡張 grep です。このバージョンの grep は、正規表現パターンを検索する際に効率的で迅速です。なぜなら、メタキャラクターをそのまま扱い、grep のように文字列として置き換えないため、grep のようにエスケープする負担から解放されます。それは ERE または拡張正規表現セットを使用します。
egrepの場合、メタキャラクターをエスケープしなくても、それらは特別な文字として扱われ、文字列の一部としてではなく、その特別な意味に置き換えられます。
$ egrep -C 0 '(f|g)ile' check_file
egrep -C 0 '\(f\|g\)ile' check_file
ここでのように、egrepは、メタキャラクターがエスケープされていない場合、“file ”文字列を検索しました。これは、これらの文字の意味によるものです。しかし、これらの文字がエスケープされると、egrepはそれらを文字列の一部として扱い、ファイル内で完全な文字列“(f|g)ile ”を検索しました。
fgrepコマンド
Fgrep、または固定grep、またはgrep -Fは、正規表現を認識せず、メタ文字も認識しないため、全体の文字列を検索する際に迅速に検索できるgrepの別のバージョンです。直接文字列を検索する場合は、このバージョンのgrepを選択すべきです。
Fgrepは完全な文字列を検索し、エスケープされていてもいなくても、特殊文字を正規表現の一部として認識しません。
$ fgrep -C 0 '(f|g)ile' check_file
fgrep -C 0 '\(f\|g\)ile' check_file
同様に、メタ文字がエスケープされていない場合、fgrep はファイル内の完全な文字列 "(f|g)ile " を検索し、メタ文字がエスケープされている場合、fgrep コマンドはファイル内のすべての文字 "\(f\|g\)ile " を検索します。
私たちはすでにgrepコマンドのいくつかの実用的な例を取り上げており、Linuxでgrepコマンドをより活用したい場合は、こちらをお読みいただければと思います。
Linux grep コマンドの実用的な 12 の例を学ぶ
結論
上記のハイライトは、‘grep’、‘egrep’、および‘fgrep’の違いです。使用される正規表現のセットと実行速度の違いを除けば、コマンドラインパラメータは3つのgrepのバージョンすべてで同じままであり、さらに「egrep」や「fgrep」の代わりに「grep -E」や「grep -F」を使用することが推奨されています。
これらの三つのgrepのバージョン間で他に違いを見つけた場合は、コメントでお知らせください。




