今晚我正在玩管道和 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.log
和dpkg.log
。 shell 将扩展d*
为按字母顺序排列的这些文件的列表(这取决于您的区域设置)。这可能会导致:
grep daemon.log dmesg dpkg.log
daemon.log
此命令搜索文件dmesg
和中是否存在该字符串dpkg.log
。如果这些文件中没有出现该字符串,则不会有输出结果。