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。你必须保证全路径匹配才行。