[shell] grep里的星号(*)和双引号(“)

小心使用grep里的星号(*)

grep "/home/.*test"

上面这句是找出所有/home目录下,以test结尾的文件

grep "/home/*test"

这句可就不是了,这句grep只匹配以下的文件名:

/hometest

/home/test

/home//test

/home///test

看明白了,星号(*)代表重复其前面的字符任意次(包括零),而“/*“当然就表示重复”/”任意次。

另外注意grep后面的正则表达式务必加上双引号,如果不加,在一些特殊场合会有完全不同的含义。

比如我当前目录下有六个文件:

testa

testb

testc

testd

tt

t

运行:

ls -l|grep t*t

它会把这五个文件都列出来吗?不,结果显示只找到了文件tt

因为上面的shell命令,grep实际上是在找以t开头且以t结尾的文件(这一规则和ls的规则一样)

要想grep把后面的”t*t”当成正则表达式,需要加上双引号:

ls -l|grep "t*t"

这下结果ok了:所有六个文件都可以被找到。


相关文章

分类

4 Comments

xiaohe said:

吹毛求疵一下:)
grep t*t是先做了shell展开,在当前路径下作匹配. 在你给的例子里面ls -l | grep t*t 等同于ls -l | grep tt
加了引号的不叫做正则, 称为pattern,grep -P 的选项是使用的正则表达式...

DongHao Author Profile Page said:

你的解释应该是正解。
受教了。

uestcer said:

grep -P是使用Perl的正则表达式,ls -l|grep t*t 里的*应该是Shell的通配符(wildchar),而不是正则表达式里*的意思

DongHao Author Profile Page said:

受教

留言:

关于文章

This page contains a single entry by DongHao published on 01 25, 2010 4:02 PM.

[compiler] gcc下的errno冲突 was the previous entry in this blog.

[pthread] pthread_join与pthread_detach is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.