ack 比 grep 更好

我想向您介绍一款可以极大简化生活的搜索实用程序。 当我到达服务器并且需要查找某些内容时,我做的第一件事是检查是否安装了 ack。 该实用程序是 grep 的绝佳替代品,在某种程度上也是 find 和 wc 的替代品。 为什么不使用 grep 呢? Ack 具有更好的开箱即用设置、更多人类可读的选项、perl 正则表达式和配置系统。 如果您喜欢(必须)通过终端进行搜索,那么您一定要尝试一下。

基本特点

Ack 默认是递归的,写更少的选项总是一个好主意。

我们可以使用一个标志 -w告诉实用程序寻找由单词边界(空格、斜线等)包围的模式实例。

ack -w mysql

ack 比 grep 更好

Ack支持按文件类型搜索。 例如,让我们在 json 文件中查找模块版本。

ack --json '"version":s+"d+.d+.d+"'

ack 比 grep 更好

可以使用以下命令查看支持的文件类型的完整列表:

ack --help-types

例如,您通常需要计算某个短语在日志文件中出现的次数,以了解脚本处理了多少数据。

ack 比 grep 更好
我们计算 test.log 文件中进程发生的次数,不考虑大小写(-i).

我们不仅可以计算一个特定文件中的出现次数,还可以计算一组中的出现次数。 我们来结束之前对mysql这个单词的搜索:统计单词出现的次数(-与) 在 *.js 文件中(--js),排除未找到任何内容的文件(-h)并总结结果。

# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql

ack 比 grep 更好

此外,我们可以使用 (-l)

ack --js -w -cl mysql

ack 比 grep 更好

如果您需要额外的搜索上下文,您可以询问 ack
显示最多行 (-B) 之后 (-A) 找到的表达式。 为此,您需要在选项后指定需要显示的行数。

# 2 строки до 
ack --js --column -B 2 "query.once('" ./lib/

ack 比 grep 更好

# 2 строки после 
ack --js --column -A 2 "query.once('" . /lib/

ack 比 grep 更好

如果您两者都需要,请使用 (-从)

ack --js --column -C 2 "query.once('" ./lib/

还有一个选项(-v) 反转搜索,即显示不包含给定模式的行。

正则表达式

Ack 与 grep 不同,使用 Perl 兼容表达式。
对我来说这是一个很大的优点;我不必记住正则表达式的单独语法。

ack 'vars+adds+'

ack 比 grep 更好

更复杂的例子

ack '*s+[vd+.d+.d+]'

ack 比 grep 更好

通常,您只想在结果中保留与模板匹配的内容。 --output 选项在这里会有帮助(-o)

ack -o '*s+[vd+.d+.d+]'

ack 比 grep 更好

此外,使用括号我们可以选择找到的部分并通过 $[group number] 变量在输出中访问它。 例如,

ack --output='version is $1' '*s+[v(d+.d+.d+)]'

ack 比 grep 更好

Ack 有有用的选项 --范围开始 и --范围结束。 他们在什么时候提供帮助
数据不是以一行的形式存储,而是以多行的形式存储。

例如有一个带有sql代码的文件

ack 比 grep 更好

让我们提取列名称。 块的开头是以 SELECT 开头的行,结尾是以 FROM 开头的行。

ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql

ack 比 grep 更好

如果搜索表达式包含特殊字符,例如句点、括号等,那么为了不使用 转义它们,您可以使用该选项 -Q.

# Поиск с экранированием 
ack --json 'mysql.'    
# Поиск без экранирования
ack --json -Q mysql.

ack 比 grep 更好

处理文件

获取具有特定扩展名的文件列表

ack -f --js

ack 比 grep 更好

使用选项 (-g).

ack -g --js '/Pa.+.js$'

ack 比 grep 更好

布局

该实用程序有自己的配置文件。 您可以同时拥有用户的全局配置 (~/.ackrc) 和特定文件夹的本地配置(您需要在该文件夹中创建一个 .ackrc 文件)。

配置中写入的大多数选项都可以在调用时手动指定。 让我们看一下其中的几个。

搜索时忽略文件夹

--ignore-dir=dist

让我们添加一个自定义文件类型 -vue。

--type-add=vue:ext:js,vue

现在您可以使用 --vue 选项来搜索文件 .vue。 例如: ack --vue 应用程序.
您可以为此选项指定扩展名列表。 例如,这里,当使用-vue时,将处理以下内容:
.js 文件。

忽略文件,例如缩小的 *.min.js

--ignore-file=match:/.min.js$/

安装

CentOS的

yum update -y && yum install ack -y

Ubuntu

apt-get update -y && apt-get install ack-grep -y

Mac OS

brew update && brew install  ack

从现场安装

curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ack

编辑器插件:

结论

这些并不是所有的可能性。 可以通过运行以下命令查看完整的函数列表:

ack –-help
# или
ack --man

ack 实用程序允许您在终端中进行搜索更加方便和灵活。 并使用管道(ack -C 10 你好 | 确认世界)您可以创建一个强大的组合来搜索和过滤文件系统和文件本身中的数据。

来源: habr.com

添加评论