GREP是我很常用的命令,尤其在瀏覽代碼時,可以用它來搜索一個變量/函數(shù)在哪些文件里面被引用了。
但grep有一些不爽的地方,這兩天看到了兩個跟grep類似的東東,可以在一定場景彌補grep的不足,甚至是替代它。 ACKack的廣告詞是“better than grep, a source code search tool for programmers”,它旨在解決grep用在寫代碼時的諸多不爽: 1. 排除一些不需要搜索的文件/目錄在寫代碼時,我們常常會有.svn, .cvs這些目錄,還有 foo~, #foo#這些臨時文件/備份文件,以及一些二進制文件。要在grep命令行排除這些目錄,是很麻煩的的,因為傳統(tǒng)grep并沒有這個能力,而是要結(jié)合find來使用:
這不僅很繁瑣,而且在文件很多時會因命令過長而出錯。如果是在Windows系統(tǒng)上就相當(dāng)讓人抓狂了(是的,你可以用一個msys或者cygwin提供的bash來作為shell,以便它支持上述復(fù)雜的shell命令,但調(diào)用其它Windows程序的地方又悲劇了)。 而ack的解決辦法很簡單:把這些東西內(nèi)置到程序里,搜索時自動忽略這些文件。
2. 讓grep只搜索某些類型的文件,但要求搜索子目錄grep可以搜索子目錄(用-R選項),但這種情況下你就不能再指定文件類型,所以傳統(tǒng)的方法也是結(jié)合find來折騰:
在GNU grep 2.5版本上,你可以用 --include=PATTERN --exclude=PATTERN 這兩個選項來過濾文件類型:
這個命令行也挺長,而且你得有個GNU grep >= 2.5。 ack的解決思路是:1)缺省就搜索子目錄;2)對常用編程語言,ack里面寫好了對應(yīng)哪些文件擴展名,比如perl是.pl, .pm和.pod,那么你只要指定按perl這個語言搜就行了。于是上述命令可以簡化為:
如果只想排除perl類型的文件,則可以用:
你可以--type-add TYPE=.ext[,ext2[,...]]或者--type-set TYPE=.ext[,ext2[,...]]來臨時定制文件類型(如果要長期使用,可以修改~/.ackrc。 同時,也許你已經(jīng)注意到了,其實ack也可以用來替代那一大堆find命令,用來搜索指定類型的文件本身(而不是文件內(nèi)容),ack當(dāng)然也支持,只需要添加-f 選項就行了:
ack的其它特點
安裝Debian/Ubuntu上改名叫ack-grep了,用apt-get install ack-grep就可以裝上了(命令名也是叫ack-grep而不是ack)。
ack是用perl5寫的,并沒有什么第三方依賴,所以在其它系統(tǒng)上安裝也很簡單,只要從CPAN安裝App::Ack模塊就可以了。另外該網(wǎng)站還提供了一個單文件版本(standalone version),只要下載后放到bin目錄就行了(前提是安裝了perl5)。
對于Windows,我用perl2exe做了個純粹單文件版本: ack.exe
glark與ack關(guān)注點不一樣的是,glark跟關(guān)注文件里面的內(nèi)容,舉兩個例子說一下: % glark --and=2 printStackTrace catch *.java 這表示在java代碼中搜索printStackTrace和catch這兩個詞,要求這兩個詞出現(xiàn)的位置相差不超過2行;
% glark --or catch throw *.java 這表示要求搜出包含catch或者throw的行;
% glark --and=5 cout --or double float *.c 這表示要求某行包含double或者float,然后在其上下5行內(nèi)有cout出現(xiàn)。
glark也支持pcre,也缺省支持高亮文件名和匹配文字,也缺省忽略非文本文件,還跟grep的命令行選項保持很高的兼容性。 glark是用ruby寫的,也沒什么第三方依賴。 glark也已經(jīng)被Debian/Ubuntu收入(lenny開始就有了),用apt-get install glark即可安裝. |
|