2013-08-05 7 views
41

grepegrepについてはunixに質問があります。egrepとgrepの違い

私は最近をunixに勉強しているので、grepとegrepの違いは何ですか?

grepとegrepを正規表現で使用することができます。しかし、私はこれらの2つのコマンドの間に異なる何かを見つけました。

^については、grepとegrepは、最初に与えられたstuffsを含む行を見つけるのと同じ意味を持ちます。

しかし、|ために、grepのは、|の前にバックスラッシュを付けずに、|の文字を意味し、私はその前にバックスラッシュを置けば、それはそれでラインを見つけるの特別な意味を回すもののいずれかを含みますそれの前と後ろにある。しかし、egrepの場合、それは逆です。 |はgrepの後者の意味を持ち、\|はgrepの前の意味を持っています。

誰かが親切に理由を説明できますか?

答えて

64

はい、できます。

egrep

コマンドはgrepバイナリのショートカットが、grepegrepとして呼び出されたとき、それはgrep -Eと呼ばれるであろうように、1つの例外を除いて、grepバイナリは、その内部ロジックを起動します。違いは、あなたが...尋ねるだろうと違いは-Eパラメータは、拡張正規表現パターンの使用を可能にするということである、それはあなたが+?または|などのメタ記号(パイプ)を使用してできるようになりますどのような

。彼らは単語やファイル名で持っていたのと同じように順序文字ではなく、grepバイナリ自体のコマンドを制御します。したがって、|は論理ORを意味します。

たとえば、ディレクトリにファイルをリストし、「mp4」または「avi」エクステンションを含むものだけを表示したいとします。 egrepを使用すると、実行します:

この例では

ls | egrep "mp4|avi"

|ような行為またはコマンドを、それがlsからの出力に「MP4」または「aviファイル」の文字列のいずれかを含むすべての名前をつかむだろう。普通のgrepコマンドで実行すると、grep|コマンドを知らず、 "mp4 | avi"全文文字列(パイプシンボル)を検索するので何も表示されません。例えば。あなたのディレクトリに|MPG|cool-guy.q2.statsファイルがある場合、パイプで検索する普通のgrepで取得します。

Soooだから、と同じ効果を得るには、egrepコマンドで|コマンドをエスケープする必要があります。エスケープすると|という特殊な意味が表示され、grepバイナリが表示されます。

+2

こんにちは、ありがとうございます。それは非常に明確です。私は本当に本当にそれを感謝します。 –

+8

良い説明。私が追加するのは、基本的な正規表現は '+'、 '?'、 '|'などのメタシンボルを認識しますが、それらをエスケープして( '\')一方、 "grep -E 'a | b'"はgrep 'a \ | b' "(aまたはbと一致)と同じであり、 grep -E 'a \ | b' "は" grep 'a | b' "と同じです(文字列 'a | b'にのみ一致します) –

+0

' egrep'、 '?'、 '+' '{' ' | ''( '' ')'は正規表現のシンボルです。 – Hunger

0

のgrepコマンドは、ファイルに必要なPATRANを持つ行を検索するために使用され、我々は置くことによって、別々のメタキャラクタを持っている「\」

のegrepは、正規表現の使用を{拡張さ-Eを、grepするに等しいです}、(、)、| ,? T |式の '\' 与えることなくメタ文字として

のfgrepは-F

test.txtの
ファイル
タイル
(Fをgrepするに等しい固定文字列を、見つけるために使用されます)ILE
(\ F \ | \ tの)ILE

はgrep "(F | T)ILE" test.txtの
(F | T)ILE

はgrep「(\ fと\ | \トン)私ル」のtest.txt
はファイル
タイル

egrepの "(F | T)ILE" test.txtの
ファイル
タイル

のegrep "(\ F \ | \ tの)ILE" テスト.TXT
(F | T)ILE

fgrepは "(F | T)ILE" test.txtの
(F | T)ILE

fgrepは「(\ fと\ | \トン)ile "test.txt
(\ f \ | \ t)ile