Bra*_*ris 5 shell grep quoting regular-expression
今晚我正在玩管道和 grep。我知道 grep 使用正则表达式,并且 * 表示前一个字符出现 0 次或多次。所以我的理解是,如果我执行以下命令,应该列出整个目录......但没有列出任何内容。发生的只是命令行重置:
[root@LinuxAcademy etc]# ls /etc | sort | grep d*
[root@LinuxAcademy etc]#
Run Code Online (Sandbox Code Playgroud)
但是,如果我再次执行该命令并将 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>>
Run Code Online (Sandbox Code Playgroud)
尽管在使用 grep d* 时没有出现错误,但我将 stderr 重定向到一个文件只是为了检查,但没有打印任何内容。
然后我认为 grep 可能将 'grep d*' 中的 'd' 解释为一个选项或命令......但似乎也不是这种情况。
任何人都可以帮助我了解发生了什么以及为什么当我使用命令时
grep d*
Run Code Online (Sandbox Code Playgroud)
什么都没有列出?
Joh*_*024 10
正则表达式不是 glob。
我猜你想要以“d”开头的文件。在这种情况下,您需要:
ls /etc | sort | grep '^d'
Run Code Online (Sandbox Code Playgroud)
以下语句的行为取决于当前目录中的文件:
ls /etc | sort | grep p*
Run Code Online (Sandbox Code Playgroud)
由于它没有被引用,shell 将尝试扩展 glob p*,用当前目录匹配的任何文件名替换它。
如果没有文件名匹配,则将文字p*传递给grep. 由于grepexpects 正则表达式,因此它解释p*为表示字母 出现零次或多次p。由于所有内容都有 ap或没有,因此匹配所有内容。
grep d*什么都不罗列出来?这可能意味着d当前目录中有一个以 开头的文件名。具体来说,假设文件名为dichotomy. shell 扩展d*为dichotomy并将其作为参数传递给grep。因此,有效的命令是:
grep dichotomy
Run Code Online (Sandbox Code Playgroud)
这可能是您运行时没有结果的原因grep d*。
d*glob会发生什么?考虑以下命令:
grep d*
Run Code Online (Sandbox Code Playgroud)
如果它们是与该 glob 匹配的多个文件,请说dmesg daemon.log和dpkg.log. shell 将按d*字母顺序扩展到这些文件的列表(这取决于您的语言环境)。这可能会导致:
grep daemon.log dmesg dpkg.log
Run Code Online (Sandbox Code Playgroud)
此命令搜索daemon.log文件dmesg和dpkg.log. 如果该字符串未出现在这些文件中,则不会产生任何输出结果。