IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

linux下的高效代码搜索工具-ack

the5fire的技术博客 2013-04-06 23:15:38 累计浏览 6,652 次
本机暂存

什么是ACK?

  • http://betterthangrep.com

  • ack is a tool like grep, optimized for programmers

  • is written purely in Perl 5,takes advantage of the power of Perl's regular expressions.

  • 作者在厌烦了不停的写下面的这个查找命令之后,开发了ack这个工具

grep foo $(find . -name '*.pm' | grep -v .svn)

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

安装

   ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。sudo apt-get install ack-grep

特点

   大家都说自己的东西好,因此ack官网列出了这工具的5大卖点:

  • 速度非常快,因为它只搜索有意义的东西。

  • 更友好的搜索,忽略那些不是你源码的东西。

  • 为源代码搜索而设计,用更少的击键完成任务。

  • 非常轻便,移植性好。

  • 免费且开源

better than grep?

   先来看下grep的日常用法。

grep常用操作
  • grep -r 'hello_world'    # 简单用法

  • grep '^hello_world' .    # 简单正则

  • ls -l | grep .py         # 管道用法

  •    一些参数:

-c(统记)/ -i(忽略大小)/ -h(不显示名称)/
-l(只显文件名)/ -n(加行号)/ -v(显示不匹配)

   这些命令在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话(当然这是说在不知道ack之前)。

ack功能划分

   在记忆的时候大体上可以分为这几个部分:

  • Searching代码搜索

  • Search output搜索结果处理

  • File presentation文件展示

  • File finding文件查找

  • File inclusion/exclusion文件过滤

  •    下面对每一项给几个简单实用的例子。

Searching

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

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

Search File

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

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

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

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

File presentation

   输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下

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

File finding

   没错,它可以查找文件,以省去你要不断的结合find和grep的麻烦,虽然在linux的思想是一个工具做好一件事。

ack-grep -f hello.py    # 查找全匹配文件
ack-grep -g hello.py$    # 查找正则匹配文件
ack-grep -g hello  --sort-files     #查找然后排序

File Inclusion/Exclusion

   文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码是不小心命中日志中的某个关键字的话,你会觉得这个有用。

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

ack配置

   也是一个相当赞的功能,对grep了解不多,不知道grep有没有同样的东西。通过配置可以把你的个人习惯做为默认配置,比如我是python程序员,那默认我要搜索的文件大多数必然是.py的文件。每次搜索时都要输入:--python那就太无聊了。

   另外还可以自己指定类型,通过--type-set=conf=.conf,指定一个.conf的文件形式,ack默认提供常见源码的支持。你可以通过:ack-grep --help types查看它支持多少中类型的源码,绝对有你不知道的语言。

   下面是一个简单的配置

# 设置排序
--sort-files
#设置文件过滤
--python
--html
--js
--conf
# 设置显示
--noheading
# 定义新的文件类型
--type-set=conf=.conf
# 智能识别大小写
--smart-case
# 设置以less形式展示,设定less参数
--pager=less -R -M --shift 5 -i

一些资源

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. 28个Unix/Linux的命令行神器 (累计阅读 16,791)
  2. Linux如何统计进程的CPU利用率 (累计阅读 16,307)
  3. 调试工具之GDB (累计阅读 14,829)
  4. 我的 RHCA 之路 (累计阅读 14,012)
  5. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  6. 给程序员新手的一些建议 (累计阅读 13,089)
  7. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  8. 关于linux内存free的一些事情 (累计阅读 12,867)
  9. ps - 按进程消耗内存多少排序 (累计阅读 12,686)
  10. Google怎么用linux (累计阅读 12,581)