ack
比grep好用的文本搜索工具
安装
# ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。
sudo apt-get install ack-grep
# alpine Linux-apk软件包管理器 安装 ack
apk install ack
用法
ack [选项] ...模式[文件或目录]
PATTERN从当前目录开始向下搜索树中的每个源文件。如果指定了任何文件或目录,则仅检查那些文件和目录。ack也可以搜索STDIN,但前提是没有指定文件或目录参数,或者其中之一是-。
可以在ACK_OPTIONS环境变量或.ackrc文件中指定默认开关。如果您不希望依赖于环境,请使用关闭它–noenv。
ack -i 选择
参数
这些参数在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话
-c(统计)/ -i(忽略大小)/ -h(不显示名称)/
-l(只显文件名)/ -n(加行号)/ -v(显示不匹配)
正在搜寻
参数 | 说明 |
---|---|
-i, --ignore-case | 忽略模式中的区分大小写 |
–[no]smart-case | 忽略模式中的区分大小写,但仅当模式不包含大写字母时如果-i指定则忽略。 |
-v, --invert-match | 反转匹配:选择不匹配的行 |
-w, --word-regexp | 强制模式仅匹配整个单词 |
-Q, --literal | 引用所有元字符:模式是文字 |
搜索输出
参数 | 说明 |
---|---|
–lines=NUM | NUM每个文件仅打印行 |
-l, --files-with-matches | 仅打印包含匹配项的文件名 |
-L, --files-without-matches | 仅打印不匹配的文件名 |
–output=expr | 输出每一行的表达式求值,关闭文本突出显示 |
-o | 仅显示行匹配模式的一部分 |
–passthru | 打印所有行,无论是否匹配 |
–match PATTERN | 明确指定模式。 |
-m, --max-count=NUM | NUM匹配后停止在每个文件中搜索 |
-1 | 一场比赛后停止搜寻 |
-H, --with-filename | 打印每个匹配项的文件名,除非明确搜索单个文件,否则这是默认设置。 |
-h, --no-filename | 禁止在输出中添加前缀文件名 |
-c, --count | 显示每个文件匹配的行数 |
–[no]column | 显示第一个匹配项的列号 |
-A NUM, --after-context=NUM | NUM匹配行后打印尾随上下文的行 |
-B NUM, --before-context=NUM | NUM在匹配行之前打印前导上下文的行 |
-C [NUM], --context[=NUM] | 打印NUM输出上下文行,预设值为2。 |
–print0 | 打印空字节作为文件名之间的分隔符,仅适用于-f, -g, -l, -L or -c。 |
-s | 抑制有关不存在或不可读文件的错误消息 |
特点
ack官网列出了这工具的5大卖点:
- 速度非常快,因为它只搜索有意义的东西。
- 更友好的搜索,忽略那些不是你源码的东西。
- 为源代码搜索而设计,用更少的击键完成任务。
- 非常轻便,移植性好。
- 免费且开源
实例
在记忆的时候大体上可以分为这几个部分:
Searching 代码搜索
Search output 搜索结果处理
File presentation 文件展示
File finding 文件查找
File inclusion/exclusion 文件过滤
grep常用操作
grep -r 'hello_world' # 简单用法
grep '^hello_world' . # 简单正则
ls -l | grep .py # 管道用法
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 # 查找匹配正则的文件
评论区