为什么我的 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),而且为什么它给了我两次?

答案1

您使用的正则表达式dd*, 在 shell 中根本没有被引用。这意味着 shell 将使用它作为文件名通配模式,并将其扩展为所有匹配的文件名(dd1dd2dd3)。

因此,该命令将是

grep -E dd1 dd2 dd3 dd1 dd2 dd3

这与跨文件、、、和 的grep模式一起运行。您从文件中得到两行,因为有一行与表达式匹配,但该文件在文件列表中出现了两次。dd1dd2dd3dd1dd2dd3dd3

要将模式提供给grepshell 未扩展的部分,请引用它:

grep 'dd*' dd1 dd2 dd3

或者,等价地,

grep -E 'd+' dd[123]

答案2

您需要引用您的模式,否则它将被 shell 扩展。

dd*扩展到dd1 dd2 dd3

所以你实际上运行:

grep -E dd1 dd2 dd3 dd1 dd2 dd3

你要

grep -E 'dd*' dd1 dd2 dd3

但是要获得带有 a 的每一行d,您可以运行:

grep -F 'd' dd1 dd2 dd3

相关内容