web-dev-qa-db-ja.com

`grep`、` egrep`、 `fgrep`の違いは何ですか?

grepegrepfgrepの技術的な違いを教えて、適切な例を教えてもらえますか?

grepではなくegrepを使用する必要があるのはいつですか?

287
mr_eclair
  • egrepgrep -E と100%等価です
  • fgrepgrep -F と100%等価です

従来、これらのスイッチは個別のバイナリで提供されていました。一部の本当に古いUnixシステムでは、個別のバイナリを呼び出す必要があることがわかりますが、最新のシステムではすべてスイッチが推奨されます。 grepのmanページにこれに関する詳細があります。

それらが何をするかについては、-Eはgrepを特別なモードに切り替え、式が通常のパターンマッチングではなくERE(拡張正規表現)として評価されるようにします。この構文の詳細は、manページにあります。

-E, --extended-regexp
PATTERNを拡張正規表現として解釈する

-Fスイッチは、grepを別のモードに切り替え、照合するパターンを受け入れますが、そのパターンを1行ごとに1つの検索文字列に分割し、OR特別なパターンマッチングを行わない文字列。

-F, --fixed-strings
PATTERNを固定文字列のリストとして解釈します。改行で区切られ、そのいずれかが一致します。

以下にいくつかのシナリオ例を示します。

  • たとえば、プレーンテキストの10個のUnixユーザー名のリストを含むファイルがあります。マシン上のグループファイルを検索して、リストされている10人のユーザーのいずれかが特別なグループに属しているかどうかを確認します。

    grep -F -f user_list.txt /etc/group
    

    -Fスイッチがここで役立つ理由は、パターンファイルのユーザー名がプレーンテキスト文字列として解釈されるためです。たとえば、ドットはワイルドカードではなくドットとして解釈されます。

  • 派手な表現で検索したい。たとえば、かっこ()は、|をOR演算子として使用して、グループを示すために使用できます。-Eを使用してこの検索を実行できます。

    grep -E '^no(fork|group)' /etc/group
    

    ...「nofork」または「nogroup」のいずれかで始まる行を返します。 -Eスイッチがない場合、通常のパターンマッチングでは正確なパターンを検索するだけなので、関係する特殊文字をエスケープする必要があります。

    grep '^no\(fork\|group\)' /etc/group
    
304
Caleb

man grepから:

 egrepはgrep -Eと同じです。
 fgrepはgrep -Fと同じです。 egrepまたは
 fgrepとしての直接呼び出しは非推奨ですが、それらに依存する履歴アプリケーション
を変更せずに実行できるようにするために提供されています。

しないでください grepped文字列をパターンとして解釈する場合は、fgrepまたはgrep -Fを使用します。

拡張正規表現を使用する必要がある場合は、egrepまたはgrep -Eを使用します。

33
rozcietrzewiacz

egrepおよびfgrepは、基本的にgrep -Eおよびgrep -Fと同等です(それぞれ):

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)

ただし、エラーメッセージは異なる場合があります。

15

「man grep」から:

egrep、fgrepおよびrgrepの3つのバリアントプログラムを使用できます。 egrepはgrep -Eと同じです。 fgrepはgrep -Fと同じです。 rgrepはgrep -rと同じです。 egrepまたはfgrepとしての直接呼び出しは非推奨ですが、それらに依存する履歴アプリケーションを変更せずに実行できるようにするために提供されています。

8
Rufo El Magufo

逐語的文字列を検索し、渡した文字列が逐語的に解釈されるようにしたい場合(つまり、ドットや疑問符が他のものとして解釈される危険を冒さずに)、fgrepまたはegrep -Fを使用します。

Egrepとgrepの違いについては、ほとんどの場合、egrepは必要なものだと思います。 GNUマニュアルサイト は、grepとegrepの違いを構文に示しています。スラッシュが必要なものとそうでないものがあります。egrepの方が多いと思いますPerl正規表現およびJavaScript正規表現と「互換性がある」ため、egrepを使用する方が簡単です。

ところで ack を試してみることを強くお勧めします-PREGをサポートし、より便利なデフォルト(つまり、.svnのようなディレクトリをスキップしたり、シンボリックリンクをたどることができる)そして、grep -Eよりもackを入力する方が少し簡単です。

3
qbolec