Linux下的高效文本搜索工具-ack

什么是 ACK?

  1. http://betterthangrep.com
  2. ack is a tool like grep, optimized for programmers
  3. is written purely in Perl 5,takes advantage of the power of Perl’s regular expressions.
  4. 作者在厌烦了不停的写下面的这个查找命令之后,开发了 ack 这个工具
    grep foo $(find . -name '*.pm' | grep -v .svn)

可以看的出来,ack 诞生的目的就是要取代 grep,从作者开发的初衷以及它官网的名字,另外它还有一个 “ 可以替代 99%grep 的工作 ” 这个口号。

Debian/Ubuntu 上改名叫 ack-grep 了,用 apt-get install ack-grep 就可以装上了 ( 命令名也是叫 ack-grep 而不是 ack)。

ack 是用 perl5 写的,并没有什么第三方依赖,所以在其它系统上安装也很简单,只要从 CPAN 安装 App::Ack 模块就可以了。另外该网站还提供了一个单文件版本 (standalone version),只要下载后放到 bin 目录就行了(前提是安装了 perl5)。

使用

-a, --all: 搜索所有文件

-C:打印匹配文本前后的 N 行文字。-A(after) ,打印匹配文本后面的 N 行,-B(befor) ,打印匹配文本前面的 N 行。

-c, --count: 覆盖正常输出,打印每个文件匹配文本的次数,没有匹配的文件输出 0,可使用 -l 输出匹配的文件。

--column: 输出匹配的列,很少用到。

-f: 仅列出来会搜索哪些文件,不做真实的搜索

-G REGEXP:仅搜索匹配给定正则的文件

-g REGEXP: -f -G REGEXP 的缩写

-i: ignore case

--[no]ignore-dir=xxx: 忽略搜索某个文件

--line=xxx: 只打印匹配文件的某些行,比如 ack Note . --line=3,4,5,6,或者 --line=3-6

-l: 只输出有匹配的文件

-L: 只输出没有匹配的文件

-n: 不进行文件夹的递归搜索

--type=TYPE /--type=noTYPE: 指定搜索要包括 / 排除的文件类型,可以使用 --TYPE/noTYPE 指定。比如搜索 java 文件: --java, 不搜索 python 文件: --nopython

--type-add TYPE=.EXTENSION[,.EXT2...]: EXTENSION 和 EXT2 为扩展名的文件作为 type 的类型的文件。比如 : --type-add python=.ptl,将 ptl 作为 python 文件。下次搜索使用 --python 时则会搜索 .ptl 文件

--type-set TYPE=ext[, ext2....]: 同上,但会覆盖原来的文件类型定义

-1: 只要搜索到第一次匹配就停止搜索

--help=types: 列出文件类型对应的扩展名

文本搜索

简单的文本搜索,默认是递归的。

ack hello
ack -i hello
ack -v hello
ack -w hello
ack -Q 'hello*'

文件搜索

对搜索结果进行处理,比如只显示一个文件的一个匹配项,或者 xxx

ack --line=1     # 输出所有文件第二行

ack -l 'hello' # 包含的文件名

ack -L 'print' # 非包含文件名

输出展示

ack hello --pager='less -R'    # 以less形式展示
ack hello --noheading # 不在头上显示文件
ack hello --nocolor # 不对匹配字符着色

文件包含

ack --python hello #查找所有python文件
ack -G hello.py$ hello # 查找匹配正则的文件

参考:

http://blog.csdn.net/kevinx_xu/article/details/20470903

http://liaofeng-xiao.iteye.com/blog/1739773

0%