CentOS系統裡如何提高文本搜尋效率?
對於系統管理員或程式員來說,當需要在複雜配置的目錄中或者在大型源碼樹中搜尋特定的文本或模式時,grep類型的工具大概是最受歡迎的。
如果grep是你最喜歡的工具之一,那麼你可能會更喜歡ack。ack是一個基於Perl的類似於grep的命令列工具,但是搜尋速度更快,能力比grep更強。尤其是當你是程式員時,我強烈推薦你使用ack來取代grep。
ack的用法非常適用與程式碼搜尋,因此程式員可以在源碼樹中進行複雜的查詢,而只需要更少的按鍵。
ack的特性
ack的一些非常強大的特性:
預設搜尋當前工作目錄
預設遞迴搜尋子目錄
忽略中繼資料目錄,比如.svn,.git,CSV等目錄
忽略二進位檔案(比如pdf,image,coredumps)和備份檔案(比如foo~,*.swp)
在搜尋結果中列印行號,有助於找到目標代碼
能搜尋特定檔案類型(比如Perl,C++,Makefile),該檔案類型可以有多種檔案尾碼
高亮搜尋結果
支援Perl的進階Regex,比grep所使用GNURegex更有表現力。
相比於搜尋速度,ack總體上比grep更快。ack的速度只要表現在它的內建的檔案類型過濾器。在搜尋過程中,ack維持著認可的檔案類型的列表,同時跳過未知或不必要的檔案類型。它同樣避免檢查多餘的中繼資料目錄。
在Linux上安裝ack
儘管在大多數Linux發行版中是ack是標準包,可輕易獲得(比如在基於debian的系統中,是ack-grep包,而在基於Redhat的系統中則是ack包),但是與發行版捆綁的ack版本仍然是1.x,而ack2.0已經發布,而且擁有更多特性。
因此我準備在官方網站下載,然後安裝ack。
方便的是,ack在官網可可作為一個單獨的Perl指令碼獲得,其中整合了所有需要依賴的模組。因此,你不需要額外安裝Perl模組來運行這指令碼。
為了在你的Linux系統中安裝ack,去官網下載最新版本的ack。在寫本文時,最新的版本是2.12
$ wget http://beyondgrep.com/ack-2.12-single-file $ sudo mv ack-2.12-single-file /usr/local/bin/ack $ sudo chmod 0755 /usr/local/bin/ack
需要注意的是,在基於Debian的系統中,有一個獨立的包也叫ack(漢碼轉換器)。所以如果你碰巧有使用那個包,那麼你就必須重新命名ack來避免命名衝突了。
ack的使用案例
1.在目前的目錄遞迴搜尋單詞”eat”,不匹配類似於”feature”或”eating”的字串:
$ ack -w eat
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 -l CFLAG
6.顯示整個記錄檔時高亮匹配到的字串:
$ tail -f /var/log/syslog | ack --passthru 192.168.1.10
7.要換取ack支援的檔案過濾類型,運行:
$ ack --help-type