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


回答:


292
  • egrep と100%同等です grep -E
  • fgrep と100%同等です grep -F

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

それらの機能については、-Egrepを特別なモードに切り替えて、式が通常のパターンマッチングではなく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
    

17
一部のシステムではありませんegrepfgrep-Eそして-F標準です。実際には小さな非互換性がありますegrep:それは{少し異なって扱います。
ジル

4
fgrepAho-Corasickバックエンドをgrep使用し、Commentz-Walterの修正バージョンを使用します。これgrepは、最悪の場合O(mn)の複雑さを持ち、最悪の場合fgrepO(m + n)であることを意味します。
スレータービクトロフ

2
ジル・「auのcontraire月キャピタン」、いくつかのシステム(古いおそらく)標準のgrepに-fオプションを持っていますが、fgrepは、いくつかの皆さんは私が特殊文字のためにはgrepを使用することについて見つけ元のスレッドにそのことについて文句を言うていないかもしれません
THESorcerer

私は最近、Androidのシステムに起こっているのegrepgrep -E異なる実行ファイル、BusyBoxのとBSDのはgrepによって処理されました。この2つのバリアントには、などの非POSIX正規表現構成の動作に違いがありました\s。これは多くの混乱をもたらしました...
Lii

33

からman grep

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

を使用するfgrepか、grepさ​​れた文字列をパターンとして解釈したくないgrep -F場合。

拡張正規表現を使用するegrepgrep -E、使用する必要がある場合。


13

egrepそしてfgrep基本的にgrep -Eandと同等です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.)

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


2
わかりました、拡張正規表現とは何ですか?以下では説明しません。いくつかの例にはいいだろう...
isomorphismes

@isomorphismes:このウィキブックのリンクはそれをうまく説明しています
...-zb226

8

「man grep」から:

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


2
質問は適切な例を求めています。
同型14

3

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

egrepとgrepの違いについては、egrepがほとんどの場合あなたが望むものだと思います。 GNUマニュアルサイトには、構文にあると思われるgrepとegrepの違いがリストされています:スラッシュを必要とするものとそうでないものがあります。egrepはperlの正規表現やjavascriptの正規表現とより「互換性がある」ので、egrepを使用する方が簡単だと思います。

ところで ackを試してみることを本当にお勧めします-PREGをサポートし、より便利なデフォルト(つまり、カラーリング、.svnのような不要なものをスキップするディレクトリ、シンボリックリンクをたどる機能など)があり、入力が少し簡単ですgrep -Eよりもack)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.