grepegrep、およびfgrepと適切な例を提供しますか?

iv id = =よりもgrepを使用する必要があるのはいつですか。 “ce05f2f12e”>

およびその逆?

コメント

回答

これまで、これらのスイッチは別々のバイナリで提供されていました。一部の非常に古い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 

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

  • 派手な表現を使用して検索したいとします。たとえば、括弧()を使用して、|が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)です。
    • Gilles " au contraire mon capitan "、一部のシステム(おそらく古い)には標準のgrepに対する-Fオプションがない場合がありますがfgrepがあり、一部のpplは、特殊文字にgrepを使用することについて見つけた元のスレッドでそれについて不満を言っています
    • 最近、egrepgrep -Eは、BusyBoxとBSDgrepというさまざまな実行可能ファイルによって処理されました。 2つのバリアントには、\sなどのPosix以外の正規表現構造の動作に違いがありました。これは多くの混乱を招きました…

    回答

    man grep

     egrep is the same as grep -E. fgrep is the same as grep -F. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified. 

    fgrepまたはgrep -Fを使用する場合正規表現された文字列をパターンとして解釈したくない

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

    回答

    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.)  

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

    コメント

    • わかりましたが、拡張正規表現の とは何ですか? '以下では実際には説明していません。いくつかの例がいいでしょう…
    • @isomorphismes:このウィキブックスのリンクはそれをうまく説明しています…

    回答

    「mangrep」から:

    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はperlregexpsおよびjavascriptregexpsとより「互換性がある」ので、egrepを使用する方が簡単だと思います。

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

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です