grepコマンドが機能しないのはなぜですか?

grepコマンドが機能しないのはなぜですか?

次のファイルがあります。

DD1含む:

ok
stanley

DD2含む:

ouddd
eddi

DD3含む:

hello
dd1

私はコマンドを使用しました

$ grep -E dd* dd1 dd2 dd3

文字dを含むすべての行を取得したいです。だから私は得ることができることを願っています

dd2: ouddd
dd2: eddi
dd3: dd1

しかし、私は得た。

dd3:dd1
dd3:dd1

なぜ最後の項目(dd3:dd1)だけを受け取るのか、なぜ2回与えるのか理解できません。

答え1

使用した正規表現はdd*シェルからまったく引用されません。これは、シェルがそれをファイル名ワイルドカードパターンとして使用し、一致するすべてのファイル名(dd1dd2および)に拡張することを意味しますdd3

だからコマンドは次のようになります

grep -E dd1 dd2 dd3 dd1 dd2 dd3

これはファイル、、、およびのgrepパターンとして機能します。 1行は式と一致するため、ファイルから2行が取得されますが、ファイルリストにはファイルが2回表示されます。dd1dd2dd3dd1dd2dd3dd3

grepパターンの拡張されていない部分をシェルに提供するには、次のように引用します。

grep 'dd*' dd1 dd2 dd3

または等しく、

grep -E 'd+' dd[123]

答え2

パターンを引用する必要があります。それ以外の場合は、シェルによって拡張されます。

dd*次に展開dd1 dd2 dd3

したがって、実際には次のように実行します。

grep -E dd1 dd2 dd3 dd1 dd2 dd3

欲しい

grep -E 'dd*' dd1 dd2 dd3

ただし、すべての行を取得するには、次のようにd実行できます。

grep -F 'd' dd1 dd2 dd3

関連情報