ls |之间有什么区别? grep * e *和ls | grep e

时间:2014-11-11 06:00:03

标签: linux shell grep ls

使用时ls | grep *e*提供的结果比ls | grep e小得多,为什么会如此呢?它们不是相同的命令。任何人都知道这些命令之间的区别。

2 个答案:

答案 0 :(得分:0)

  

ls | grep *e*ls | grep e的命令不一样吗?

不,他们是不同的。与

$ ls | grep *e*

命令shell 扩展模式*e*以匹配当前目录中包含字母e的所有文件。然后将此扩展文件列表传递给grep命令:

$ ls
Hello.txt  Null.txt  Sample.txt

执行时

$ ls | grep *e*

实际命令为ls | grep Hello.txt Sample.txt

$ ls | grep e

没有文件名扩展,实际命令为ls | grep e

另见

如果要在不扩展的情况下传递参数,则需要引用它:

$ ls | grep "*e*"

然后,该命令实际上将ls | grep *e*"*e*"作为argv[1]传递给grep命令。)

请注意,shell扩展与正则表达式不同 - shell匹配*的任何字符串,而正则表达式*表示前一个表达式的任何数字都应该出现。

答案 1 :(得分:0)

shell在执行命令之前展开*e*。因此,如果您有名为beerfree的文件,则最终会在beer中抓取free,并忽略来自ls的输入。

无论如何,

*e*不是有效的正则表达式。 *表示"前面的表达式中的零个或多个"并且在第一个实例中没有前面的表达式。正确地,grep应该显示错误,但不是。它最终匹配没有重复零次或多次,然后e重复零次或多次。因为每个可以想象的输入都包含零个或多个e次出现,所以最终会匹配每个输入行。

但无论如何,如上所述,grep不会看到此输入,因为它被shell拦截和扩展。如果你想按字面意思使用*,你需要引用它。

ls | grep '.*e.*'

只是一种非常蹩脚的说法

ls | grep 'e'

因为前导通配符和尾随通配符不会添加任何值 - grep始终在每个输入行的任何位置查找匹配项。

您真正想要的是使用shell的通配符匹配功能:

ls *e*

glob表达式*e*不是正则表达式,而是glob模式。它做了你显然期望的事情。