對于系統管理者或程式員來說,當需要在複雜配置的目錄中或者在大型源碼樹中搜尋特定的文本或模式時,grep類型的工具大概是最受歡迎的。
如果grep是你最喜歡的工具之一,那麼你可能會更喜歡ack。ack是一個基于perl的類似于grep的指令行工具,但是搜尋速度更快,能力比grep更強。尤其是當你是程式員時,我強烈推薦你使用ack來取代grep。
ack的用法非常适用與代碼搜尋,是以程式員可以在源碼樹中進行複雜的查詢,而隻需要更少的按鍵。
ack的一些非常強大的特性:
預設搜尋目前工作目錄
預設遞歸搜尋子目錄
忽略中繼資料目錄,比如.svn,.git,csv等目錄
忽略二進制檔案(比如pdf,image,coredumps)和備份檔案(比如foo~,*.swp)
在搜尋結果中列印行号,有助于找到目标代碼
能搜尋特定檔案類型(比如perl,c++,makefile),該檔案類型可以有多種檔案字尾
高亮搜尋結果
支援perl的進階正規表達式,比grep所使用gnu正規表達式更有表現力。
相比于搜尋速度,ack總體上比grep更快。ack的速度隻要表現在它的内置的檔案類型過濾器。在搜尋過程中,ack維持着認可的檔案類型的清單,同時跳過未知或不必要的檔案類型。它同樣避免檢查多餘的中繼資料目錄。
盡管在大多數linux發行版中是ack是标準包,可輕易獲得(比如在基于debian的系統中,是ack-grep包,而在基于redhat的系統中則是ack包),但是與發行版捆綁的ack版本仍然是1.x,而ack2.0已經釋出,而且擁有更多特性。
是以我準備在官方網站下載下傳,然後安裝ack。
友善的是,ack在官網可可作為一個單獨的perl腳本獲得,其中整合了所有需要依賴的子產品。是以,你不需要額外安裝perl子產品來運作這腳本。
為了在你的linux系統中安裝ack,去下載下傳最新版本的ack。在寫本文時,最新的版本是2.12
1
2
3
4
$wget http://beyondgrep.com/ack-2.12-single-file
$sudo mv
ack-2.12-single-file/usr/local/bin/ack
$sudo chmod0755/usr/local/bin/ack
需要注意的是,在基于debian的系統中,有一個獨立的包也叫ack(漢碼轉換器)。是以如果你碰巧有使用那個包,那麼你就必須重命名ack來避免命名沖突了。
1.在目前目錄遞歸搜尋單詞”eat”,不比對類似于”feature”或”eating”的字元串:
$ack-weat
2.搜尋有特殊字元的字元串’$path=.’,所有的元字元(比如’$‘,’.‘)需要在字面上被比對:
$ack-q‘$path=.‘/etc
3.除了dowloads目錄,在所有目錄搜尋”about”單詞:
$ack about--ignore-dir=downloads
4.隻搜尋包含’protected’單詞的php檔案,然後通過檔案名把搜尋結果整合在一起,列印每個檔案對應的搜尋結果:
$ack--php--group
protected
5.擷取包含’cflag’關鍵字的makefile的檔案名。檔案名為*.mk,makefile,makefile,gnumakefile的都在考慮範圍内:
$ack--make-lcflag
6.顯示整個日志檔案時高亮比對到的字元串:
$tail-f/var/log/syslog|ack--passthru192.168.1.10
7.要換取ack支援的檔案過濾類型,運作:
$ack--help-type