回答:
従来、これらのスイッチは別々のバイナリで提供されていました。一部の本当に古い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
egrep
かfgrep
。-E
そして-F
標準です。実際には小さな非互換性がありますegrep
:それは{
少し異なって扱います。
fgrep
Aho-Corasickバックエンドをgrep
使用し、Commentz-Walterの修正バージョンを使用します。これgrep
は、最悪の場合O(mn)の複雑さを持ち、最悪の場合fgrep
O(m + n)であることを意味します。
egrep
とgrep -E
異なる実行ファイル、BusyBoxのとBSDのはgrepによって処理されました。この2つのバリアントには、などの非POSIX正規表現構成の動作に違いがありました\s
。これは多くの混乱をもたらしました...
からman grep
:
egrepはgrep -Eと同じです。 fgrepはgrep -Fと同じです。egrepまたは fgrepは非推奨ですが、履歴アプリケーションを許可するために提供されています 変更せずに実行するためにそれらに依存しています。
を使用するfgrep
か、grepされた文字列をパターンとして解釈したくないgrep -F
場合。
拡張正規表現を使用するegrep
かgrep -E
、使用する必要がある場合。
egrep
そしてfgrep
基本的にgrep -E
andと同等です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.)
ただし、エラーメッセージは異なる場合があります。
「man grep」から:
3つのバリアントプログラムegrep、fgrep、rgrepが利用可能です。egrepはgrep -Eと同じです。fgrepはgrep -Fと同じです。rgrepはgrep -rと同じです。egrepまたはfgrepとしての直接呼び出しは非推奨ですが、それらに依存する履歴アプリケーションを変更せずに実行できるようにするために提供されています。
逐語的な文字列を検索し、渡された文字列が逐語的に解釈されるようにしたい場合(つまり、ドットや疑問符が何か別のものとして解釈されることを恐れずに)、fgrepまたはegrep -Fを使用します。
egrepとgrepの違いについては、egrepがほとんどの場合あなたが望むものだと思います。 GNUマニュアルサイトには、構文にあると思われるgrepとegrepの違いがリストされています:スラッシュを必要とするものとそうでないものがあります。egrepはperlの正規表現やjavascriptの正規表現とより「互換性がある」ので、egrepを使用する方が簡単だと思います。
ところで ackを試してみることを本当にお勧めします-PREGをサポートし、より便利なデフォルト(つまり、カラーリング、.svnのような不要なものをスキップするディレクトリ、シンボリックリンクをたどる機能など)があり、入力が少し簡単ですgrep -Eよりもack)。