linux grep" * .out"和ls * .out

时间:2017-05-14 15:01:55

标签: linux bash

在Bash中,当您键入ls *.out时,它将输出以.out结尾的列表。这是正则表达式吗?

如果是;当我echo a.out > test然后输入grep *.out test时,它不输出任何内容。

正则表达式中的**相同吗?

5 个答案:

答案 0 :(得分:1)

如果您要搜索以.out结尾的所有文件,请尝试grep <string> *.out

您也可以阅读globbing

答案 1 :(得分:1)

要理解的主要是你的shell正在扩展程序参数(传递给执行程序的main函数)。阅读关于shell expansions(和globbing

的Bash章​​节

因此,您不应该输入ls "*.out"而只需ls *.out,然后/bin/ls程序会以*.out扩展启动。例如,如果您有文件a.outb.outcc.outa.c *.out(由shell完成)的扩展为a.out b.out cc.out因此/bin/ls得到"ls" "a.out" "b.out" "cc.out"后跟NULL char**argv } main的第二个参数,第一个int argc参数为4。

grep确实需要一些regular expression或“regexp”。您通常要引用它(避免 shell尝试扩展)。

答案 2 :(得分:1)

它是扩展文件名为globs的shell,所以在ls *.outgrep *.out test中,shell将文件名填充到命令行,并且命令本身只看到结果列表名。假设您有名为foo.outbar.out的文件,那些命令将等同于:

ls bar.out foo.out
grep bar.out foo.out test

第一个要求ls列出文件,第二个要求grep在文件bar.outfoo.out中查找模式test。后者可能不是你想要的,所以引用grep的模式:

grep "*.out" test

除了那不是真正有效的正则表达式。在文件名字符串中,星号*匹配零个或多个字符,在正则表达式中它匹配前一个项目的零个或多个(括号中的字符,字符组或表达式),但是在行的开头没有&#39 ; t any,所以表达没什么意义。 Perl抱怨,grepsed没有,但他们似乎也不匹配。

在正则表达式中,点.表示任何字符,因此需要从字面上对其进行转义。此外,grep在行中的任何位置查找匹配项,因此可以省略前导.*(可以匹配任意数量的任何字符)。因此,这将在文件.out中查找包含字符串test的行:

grep "\.out" test

正如我们所看到的,Bash使用的模式和grep使用的模式(正则表达式)是不一样的。参见例如Bash's manual for the pattern matches used in filename expansionman page regex(7) for regular expressions。另请注意,有不同的正则表达方言,彼此之间并不完全相容。

答案 3 :(得分:0)

默认情况下,grep会查找确切的表达式,而不是正则表达式,但您可以通过添加-E标志来指示它查找正则表达式。

所以我认为你所寻找的是grep -E *.out test,虽然对网络的一点点研究会给你你想要的东西;)

答案 4 :(得分:0)

  1. 对于grep命令,*表示上一个/前一个字符或表达式出现0或更多。因此,在您的情况下,grep .out* test将起作用,因为它将查找.ou的出现,然后在文件测试中出现0或更多的任何字符。

  2. 对于ls命令,ls *.out表示列出以.out结尾的所有文件/文件夹。