grep和find的参数疑云: 左手shell通配符,右手正则表达式

grep 和 find。 对于使用linux的筒子们来说,每天都要祭出它们很多遍。 因为太熟,反而会将错误用法在它们身上一遍遍上演。

比如grep, 我最最常用下面一条:

grep -rin "ccci" *log*

因为我每天都需要在客户报回的问题日志里,找到那些以log为后缀名的文件,如radio_log, kernel_log, main_log.boot,并从中找到包含ccci关键字的行。

为了更好说明问题,我把上面这条命令写的更规范一点儿,或者说更哆嗦一点儿,就成了:

grep -rin ".*ccci.*" *log*

细看之看,一丝不安涌现。 因为ccci前后用的都是".*", 但log的前后,用的都是*。

更会让人不安的是,用以上命令能搜到的结果,如果换用grep -rin "*ccci*" *log* 或是 grep -rin ".*ccci.*" .*log.*,您将一无所获。

how can that happen. 一向最熟悉最听话的小伙伴,瞬间变得陌生。。

一切源于太熟悉,太想当然。 其实grep有它自己的个性,两个参数中,第一个.*ccci.*,它是正则表达式。 第二个*log*,它则是shell通配符。 事实就是这么简单,在这个正则表达式独步天下的世界里,shell通配符做的只是悄悄地让你跌倒一遍,再一遍..


暂别grep小伙伴,下面看到了find小朋友。心里不禁一揪,还能不能愉快地玩耍呢

find . -name "cust*" ,去搜索以cust打头的文件,通常只需要这么做。当改用find . -name "cust.*", 你将会又一次面临一无所获的窘境。是的,这儿正是shell通配符的领地,任何正则表达式尝试将被狠狠打压。

如果你真的很希望能用正则来查找文件名,find到是给了一条路,改为find . -regex ".*cust.*", 注意cust前面的.*也不可缺少,因为-regex,不像-name那般nice。你必须保证全路径匹配才行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值