ウェブサイト検索

Linux における Grep、Egrep、Fgrep の違いは何ですか?


Unix 系システムの有名な検索ツールの 1 つで、ファイルであっても、ファイル内の 1 行または複数行であっても、あらゆる検索に使用できます。 grep ユーティリティです。これは、文字列パターン、正規表現パターン、Perl ベースの正規表現などを使用した検索など、多数のオプションをサポートしているため、機能が非常に豊富です。

さまざまな機能があるため、grepegrep (拡張 GREP)、fgrep (など) を含む多くの亜種があります。 >修正 GREP)、pgrep (プロセス GREP)、rgrep (再帰 GREP) など。ただし、これらの亜種には元のgrep とは若干の違いがあり、そのため人気があり、さまざまな Linux プログラマーが特定のタスクに使用するようになりました。

まだ調査されていない主な点は、3 つの主要な亜種、つまり 'grep''egrep''fgrep' の違いは何なのかということです。 Linux ユーザーに要件に応じてどちらかのバージョンを選択させる grep の機能。

grep の特殊なメタ文字

  1. + – 前の文字の 1 つ以上の出現に相当します。
  2. ? – これは、前の文字がほぼ 1 回繰り返されることを示します。例: a? は、'a' または 'aa' と一致します。
  3. ( – 代替式の開始。
  4. ) – 代替式の終わり。
  5. |'|' で区切られたいずれかの式に一致します。例: “(a|b)cde ” は、'abcde' または 'bbcde' のいずれかに一致します。
  6. { – このメタ文字は範囲指定子の開始を示します。例: “a{2} ” は、ファイル内の “aa ” と一致します。つまり、a が 2 回一致します。
  7. } – このメタ文字は範囲指定子の終わりを示します。

grep、egrep、fgrep の違い

grepegrep、および fgrep の主な違いは次のとおりです。この一連の例では、操作が実行されるファイルを次のように想定しています。

grepコマンド

grep または Global Regular Expression Print は、Unix 系システムの主要な検索プログラムであり、任意のファイルやファイルのリスト、または任意のファイルの出力で任意のタイプの文字列を検索できます。指示。

推奨読書: Linux grep コマンドの 12 の実践例

検索パターンとして通常の文字列とは別に基本的な正規表現を使用します。基本正規表現 (BRE) では、次のようなメタ文字: '{','}','(',')','|''+''?' は意味が失われ、文字列の通常の文字として扱われるため、特殊文字として扱う場合はエスケープする必要があります。 。

推奨読書: 11 文字クラスと括弧式での高度な「Grep」コマンド

また、grep は Boyer-Moore アルゴリズムを使用して、文字列または正規表現を高速に検索します。

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 または Fixed 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 ” ファイル内のすべての文字をそのまま入力します。

Linux の grep コマンドをさらに活用したい場合は、grep コマンドの実践的な例をいくつか取り上げました。ここで読むことができます。

Linux grep コマンドの 12 の実践例を学ぶ

結論

上で強調表示されているのは、「grep」「egrep」「fgrep」 の違いです。使用される正規表現のセットと実行速度の違いを除けば、rest コマンド ライン パラメータは grep の 3 つのバージョンすべてで同じままであり、「egrep」または「fgrep」、「grep -E」または「grep -」の代わりにさえ同じです。 F」の使用を推奨します。

これら 3 つのバージョンの grep 間にその他の違いを見つけた場合は、コメントで言及してください。