命令: ls /etc |排序| grep d* 没有产生任何结果,但 ls /etc |排序| grep p* 列出整个目录

命令: ls /etc |排序| grep d* 没有产生任何结果,但 ls /etc |排序| grep p* 列出整个目录

今晚我正在玩管道和 grep。我知道 grep 使用正则表达式,而 * 表示前面的字符出现 0 次或多次。所以我的理解是,如果我执行以下命令,应该列出整个目录......但没有列出任何内容。所发生的只是命令行重置:

[root@LinuxAcademy etc]# ls /etc | sort | grep d*
[root@LinuxAcademy etc]#

但是,如果我再次执行该命令并将 d 替换为 p,则会按照我的预期列出整个目录:

[root@LinuxAcademy ~]# ls /etc | sort | grep p*
ConsoleKit
DIR_COLORS
DIR_COLORS.256color
DIR_COLORS.lightbgcolor
NetworkManager
X11
...........<<rest of listing not pasted in>>

尽管当我使用 grep d* 时没有给出错误,但我将 stderr 重定向到一个文件只是为了检查,但没有打印任何内容。

然后我认为 grep 可能会将“grep d*”中的“d”解释为选项或命令......但情况似乎也并非如此。

任何人都可以帮助我理解发生了什么以及为什么当我使用命令时

grep d*

没有列出任何内容?

答案1

正则表达式不是 glob。

我猜您想要以“d”开头的文件。在这种情况下,您需要:

ls /etc | sort | grep '^d'

什么地方出了错

以下语句的行为方式取决于当前目录中的文件:

ls /etc | sort | grep p*

由于它没有被引用,shell 将尝试扩展 glob p*,将其替换为任何文件名从当前目录匹配。

如果没有文件名匹配,则将文字p*传递给grep.由于grep需要正则表达式,因此它解释p*为表示字母 出现零次或多次p。既然一切事物要么有p,要么没有,匹配一切

为什么grep d*什么都不列出?

这可能意味着d当前目录中有一个以 开头的文件名。具体来说,假设该文件的名称是dichotomy. shell 扩展d*dichotomy并将其作为参数传递给grep.因此,有效的命令是:

grep dichotomy

这可能就是您运行时没有结果的原因grep d*

如果多个文件与d*glob 匹配会发生什么?

考虑以下命令:

grep d*

如果它们是与该 glob 匹配的多个文件,请说dmesg daemon.logdpkg.log。 shell 将扩展d*为按字母顺序排列的这些文件的列表(这取决于您的区域设置)。这可能会导致:

grep daemon.log dmesg dpkg.log

daemon.log此命令搜索文件dmesg和中是否存在该字符串dpkg.log。如果这些文件中没有出现该字符串,则不会有输出结果。

相关内容