Linux命令 ack -比grep好用的文本搜索工具
ack
比grep好用的文本搜索工具
安装
# ubuntu下要安装ack-grep,因为在debian系中,ack这个名字被其他的软件占用了。
sudo apt-get install ack-grep
# alpine Linux-apk软件包管理器 安装 ack
apk install ack
语法
ack [选项] PATTERN [文件...]
ack -f [选项] [目录...]
参数
这些参数在linux上的适用频率是相当高的,尤其是你用vim做为IDE的话
注:带逗号的为不同的输入方式,比如-a
等效于--all
。另外,以下并非全部参数列表!
-a ,--all
# 对所有文件进行操作,无论是什么类型(但仍会跳过blib、CVS等目录)
-c ,--count
# 抑制正常输出;而是为每个输入文件打印匹配行的计数。
# 如果-l有效,它将只显示每个文件中具有匹配行的行数。
# 如果没有-l,某些行计数可能为零。
# 如果与-h 组合,则ack仅输出一个总计数。
--color , --nocolor
# --color突出显示匹配的文本。 --nocolor抑制颜色。
# 除非重定向输出,否则默认情况下这是打开的。
# 在 Windows 上,此选项默认关闭,除非安装 了 Win32::Console::ANSI 联机帮助页模块或使用了ACK_PAGER_COLOR 环境变量。
--color-filename=颜色
# 设置用于文件名的颜色。
--color-match=颜色
# 设置用于匹配的颜色。
--color-lineno=颜色
# 设置用于行号的颜色。
-F
# 只打印要搜索的文件,而不实际进行任何搜索。不得指定 PATTERN,否则将作为搜索路径。
-g
# 打印相对路径 + 文件名与正则表达式匹配的文件。此选项是-f -G 正则表达式的便捷快捷方式。
# -f的使用方式详见语法示例第二例
# 选项-i、-w、-v和-Q不适用于此正则表达式。
-G
# 搜索中只包含匹配正则表达式的路径。
# 整个路径和文件名与正则表达式匹配,并且正则表达式是 Perl 正则表达式,而不是 shell glob。
# 选项-i、-w、-v和-Q不适用于此正则表达式。
-H , --with-filename
# 打印每个匹配项的文件名。
-h , --no-filename
# 搜索多个文件时,禁止输出文件名的前缀。
--help
# 打印简短的帮助声明。
-i , --ignore-case
# 忽略搜索字符串中的大小写。
# 这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。
-l ,--files-with-matches
# 只打印匹配文件的文件名,而不是匹配的文本。
-L, --files-without-matches
# 只打印不匹配的文件名。这等效于指定-l和-v。
-n ,--no-recurse
# 不递归到子目录。
-Q ,--literal
# 引用 PATTERN 中的所有元字符,它被视为文字。
# 这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。
-r , -R , --recurse
# 递归到子目录。这是默认设置,只是为了与 grep 兼容。
# 您还可以使用它来关闭--no-recurse。
-v , --invert-match
# 反转匹配:选择不匹配的行
# 这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。
--version
# 显示版本和版权信息。
-w , --word-regexp
# 强制 PATTERN 只匹配整个单词。PATTERN 用\b元字符包装 。
# 这仅适用于 PATTERN,不适用于为-g 和-G选项提供的正则表达式。
特点
ack官网列出了这工具的5大卖点:
- 速度非常快,因为它只搜索有意义的东西。
- 更友好的搜索,忽略那些不是你源码的东西。
- 为源代码搜索而设计,用更少的击键完成任务。
- 非常轻便,移植性好。
- 免费且开源
实例
在记忆的时候大体上可以分为这几个部分:
Searching 代码搜索
Search output 搜索结果处理
File presentation 文件展示
File finding 文件查找
File inclusion/exclusion 文件过滤
grep常用操作
grep -r 'hello_world' # 简单用法
grep '^hello_world' . # 简单正则
ls -l | grep .py # 管道用法
搜索
简单的文本搜索,默认是递归的。
ack-grep hello
ack-grep -i hello
ack-grep -v hello
ack-grep -w hello
ack-grep -Q 'hello*'
搜索结果处理
对搜索结果进行处理,比如只显示一个文件的一个匹配项,或者xxx
ack-grep --line=1 # 输出所有文件第二行
ack-grep -l 'hello' # 包含的文件名
ack-grep -L 'print' # 非包含文件名
输出结果展示
输出的结果是以什么方式展示呢,这个部分有几个参数可以练习下
ack-grep hello --pager='less -R' # 以less形式展示
ack-grep hello --noheading # 不显示头文件
ack-grep hello --nocolor # 不对匹配字符着色
文件查找
没错,它可以查找文件,以省去你要不断的结合find和grep的麻烦,就像linux的思想:一个工具做好一件事。
ack-grep -f hello.py # 查找全匹配文件
ack-grep -g hello.py$ # 查找正则匹配文件
ack-grep -g hello --sort-files # 查找然后排序
文件过滤
文件过滤,个人觉得这是一个很不错的功能。如果你曾经在搜索项目源码时不小心命中日志中的某个关键字的话,你会觉得这个有用。
ack-grep --python hello # 查找所有python文件
ack-grep -G hello.py$ hello # 查找匹配正则的文件
参考资料