程序员的命令行搜索工具

file

本文翻译整理自 Command Line Search Tools for Programmers

在过去的几年中,我通过一些面向程序员的工具改进了我的命令行搜索。通过这些工具可以快速的帮助开发人员在不熟悉的代码库中快速找到关键字句,而且没有使用起来简单方便,没有 grep 那么复杂。

搜索一个唯一的 字符串关键字 是一个很好的找到功能所在位置的方式,从而不必跳到文本编辑器。我以前有使用另一个命令,你通过可以通过运行 history 并使用一个工具,像 grep 一样筛选符合给定模式的行。

以下是五个命令行搜索工具的列表,如果您有兴趣更多地使用命令行来快速查找代码,文本和文件,而不依赖于编辑器或IDE,则可以帮助您成为开发人员。

有些工具只能运行在 Linux 中,但是我列出了一些跨平台,快得可笑的工具。(PS: 这句是原话!)

Grep

使用 grep 的好处在于,它几乎可以用在你可能使用的任何 Linux 发行版上。它的实用性在很多不同的环境下都很有用,我会告诉你一些我最喜欢的东西:

如果你只想在PHP文件中找到一个短语并输出行号:

$ grep -RHn --include \*.php Controller .

假设您前几天在控制台中输入了一个命令,但您只记得部分命令。您可以通过 |history 命令来使用 grep 进行搜索:

$ history | grep "php artisan"

您可以使用命令行管理本文中列出的所有 CLI 工具,但我发现了一个更简单的 grep 过滤历史记录。它有一个好的 “副作用” 是过滤后的结果会在开始时给你一个数字,你可以用它来重新运行命令:

$ history | grep 'php artisan'
284  php artisan route:list

$ !284
$ php artisan route:list

Ack

Ack类似于 grep 的工具,但单专门为程序员优化。它默认(即你的项目)递归搜索,而忽略 VCS 目录,.git 并有便利的工具,帮助你用少量的击键来搜索代码。

以同样的 grep 为例,以下是我们如何在PHP文件中搜索 Controller

# Ack
$ ack Controller --php

# Here's the grep example
$ grep -RHn --include \*.php Controller .

假设您想搜索除 PHP 以外的所有其他类型的文件。每种类型都有一个 no 标志:

$ ack Controller --nophp

您可以通过 ~/.ackrc 文件扩展确认来添加自定义类型。比方说,你通常只用这样的 blade文件搜索:

$ ack @auth --blade
Unknown option: blade
ack: Invalid option on command line

要注册 blade类型,您可以将以下内容添加到 ~/.ackrc 文件中,然后上面的搜索仅查找以下列文件结尾的文件 blade.php

--type-set=blade:match:.blade.php$

以下是您可能希望添加一些 Laravel 开发人员的其他一些选项到 ~/.ackrc 文件中 :

# 总是使用字体颜色
--color

# 忽略 PhpStorm 和 NPM 的文件
--ignore-dir=.idea/
--ignore-dir=node_modules/

# 添加到现有的类型
--type-add=ruby:ext:haml,rake,rsel

# 添加新的类型
--type-set=smarty:ext:tpl
--type-set=cakeview:ext:ctp,thtml
--type-set=markdown:ext:md,markdown
--type-set=json:ext:json
--type-set=blade:match:.blade.php$

Ack 在不同的位置查找一个 .ackrc 文件,但是如果你想在没有任何 .ackrc 文件的情况下运行 ack ,请使用 --noenv

您可以通过运行验证您的自定义类型 ack --help-typesAck 有大量的文档,可能还有一些我还没有发现的东西。查看 ack manual 以发现更多用法。

Silver Searcher

Silver Searcher 是另一个类似于 grep 的工具,更换类似于 ACK,但它拥有更快的性能。它忽略了项目文件中找到的 .gitignore 文件中的内容。

你可以在 OS X 上使用 Homebrew 安装 Silver Searcher

brew install the_silver_searcher

您使用 ag 命令运行 Silver Searcher

$ ag Controller --php

我不会对 Silver Searcher 做详细的介绍,但是如果我想搜索大量的文件,我有时候会选择 ag

Sift

Sift 是一个用 Golang 构建的 grep 替代方案,这意味着它可以在 LinuxWindowsOS X 等平台上广泛使用。它的速度非常快,而且它有一些很酷的方法来取代 grep + awk 组合提取数据。

我建议你查看 示例,了解 Sift 强大的功能。

我们基本的 PHP 搜索已经使用了其他工具完成,这里是你如何找到 PHP 文件中的 Controller

# Only PHP
sift --ext php Controller

# Exclude PHP
sift --exclude-ext php Controller

RipGrep

RipGrepSilver Searcher 类似,但与 GNU grep的速度 类似,它可以在 MacLinuxWindows 上运行。他们自己是这样吹的:"RipGrep 通常比其他任何工具都快",各种吹 Rust 的正则表达式引擎,并且会读取 .gitignore 文件。( 像 The Silver Searcher 一样)。

以下是如何使用 RipGrep 搜索包含 ControllerPHP 文件:

rg --type=php Controller

下一步是什么

最终,我选择了 Ack 作为我的搜索工具,我认为在使用它作为 grep 替代品时,您会学到很多有价值的东西。我强烈建议学习如何使用 ack,但这些工具都具有独特的功能,能让你学到不同的东西。

如果你需要搜索大量的文件例如搜索(node_modules 文件夹),那么我建议你使用 The Silver SearcherSiftRipGrep。在大型项目中,ack 的速度确实不是那么令人满意,这会使您注意到其他工具的速度优势。

本文章首发在 Laravel China 社区