日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

grep的兩個替代品(補充?)

 灬木木的花灬 2015-09-15

GREP是我很常用的命令,尤其在瀏覽代碼時,可以用它來搜索一個變量/函數(shù)在哪些文件里面被引用了。

但grep有一些不爽的地方,這兩天看到了兩個跟grep類似的東東,可以在一定場景彌補grep的不足,甚至是替代它。

ACK

http:///

ack的廣告詞是“better than grep, a source code search tool for programmers”,它旨在解決grep用在寫代碼時的諸多不爽:

1. 排除一些不需要搜索的文件/目錄

在寫代碼時,我們常常會有.svn, .cvs這些目錄,還有 foo~, #foo#這些臨時文件/備份文件,以及一些二進制文件。要在grep命令行排除這些目錄,是很麻煩的的,因為傳統(tǒng)grep并沒有這個能力,而是要結(jié)合find來使用:

grep pattern $(find . | grep -v .svn | grep -v .cvs | egrep -v '~$' | egrep -v '^#')

這不僅很繁瑣,而且在文件很多時會因命令過長而出錯。如果是在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來折騰:

grep pattern $(find . -name '*.pl' -or -name '*.pm' -or -name '*.pod' | grep -v .svn)

在GNU grep 2.5版本上,你可以用 --include=PATTERN --exclude=PATTERN 這兩個選項來過濾文件類型:

grep -R pattern --include='*.pl' --include='*.pm' --include='*.pod' --exclude=.svn

這個命令行也挺長,而且你得有個GNU grep >= 2.5。

ack的解決思路是:1)缺省就搜索子目錄;2)對常用編程語言,ack里面寫好了對應(yīng)哪些文件擴展名,比如perl是.pl, .pm和.pod,那么你只要指定按perl這個語言搜就行了。于是上述命令可以簡化為:

ack --perl pattern

如果只想排除perl類型的文件,則可以用:

ack --noperl pattern

你可以--type-add TYPE=.ext[,ext2[,...]]或者--type-set TYPE=.ext[,ext2[,...]]來臨時定制文件類型(如果要長期使用,可以修改~/.ackrc。

同時,也許你已經(jīng)注意到了,其實ack也可以用來替代那一大堆find命令,用來搜索指定類型的文件本身(而不是文件內(nèi)容),ack當(dāng)然也支持,只需要添加-f 選項就行了:

ack -f --perl

 

ack的其它特點

  • 支持pcre
  • 缺省支持顏色,而且會比較智能地不使用顏色
  • 支持很多grep的選項,比如-A(--after-context), -B(--before-context), -C(--context), -H(--with-filename), -i(--ignore-case), -v(--invert-match), -w(--word-only)......

安裝

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

http://www./projects/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即可安裝.





    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多