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