grep
、egrep
、およびfgrep
と適切な例を提供しますか?
iv id = =よりもgrep
を使用する必要があるのはいつですか。 “ce05f2f12e”>
およびその逆?
コメント
- スーパーユーザーは、grep、egrep、fgrepとの違いをよく示しています。 pgrep: superuser.com/questions/508881/ …
回答
これまで、これらのスイッチは別々のバイナリで提供されていました。一部の非常に古い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を使用することについて見つけた元のスレッドでそれについて不満を言っています
- 最近、
egrep
とgrep -E
は、BusyBoxとBSDgrepというさまざまな実行可能ファイルによって処理されました。 2つのバリアントには、\s
などのPosix以外の正規表現構造の動作に違いがありました。これは多くの混乱を招きました…