程序员的命令行搜索工具
发表于 作者: Paul Redmond
在过去的几年里,我通过一些针对程序员的工具改善了我的命令行搜索。这些工具可以帮助开发人员在不熟悉的代码库中找到文本文件中的短语和模式,而无需像 grep 那样复杂。
搜索唯一的字符串或关键字是找出功能所在位置的绝佳方法,无需进入文本编辑器。我另一个用途是找到您通过 `history` 运行的先前命令,并使用 `grep` 等工具来过滤匹配给定模式的行。
以下列出了五个命令行搜索工具,如果您有兴趣更多地使用命令行来快速查找代码、文本和文件,而不依赖于编辑器或 IDE,那么这些工具将会对您有所帮助。
其中一些工具仅适用于类 Unix 系统,但我列出了几个跨平台且速度极快的工具!
Grep
使用 grep 的好处是它几乎可以在您使用的任何类 Unix 系统发行版上使用。它的用途在许多不同的情况下非常强大,我将向您展示一些我最喜欢的用法。
如果您想仅在 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` 文件扩展 ack 以添加自定义类型,例如 `--php`。假设您通常只在以下类型的文件中搜索,例如:
$ ack @auth --bladeUnknown option: bladeack: Invalid option on command line
要注册“blade”类型,您可以将以下内容添加到 `~/.ackrc` 文件中,然后上面的搜索将只查找以 `blade.php` 结尾的文件。
--type-set=blade:match:.blade.php$
以下是一些您可能想作为 Laravel 开发人员在 `~/.ackrc` 文件中使用的其他选项。
# Always use color--color # Ignore PhpStorm and NPM--ignore-dir=.idea/--ignore-dir=node_modules/ # Add to existing types--type-add=ruby:ext:haml,rake,rsel # Add new types--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-types` 来验证您的自定义类型。Ack 有大量的文档,可能做了一些我还没发现的事情。查看 `man ack` 以获取更多信息,或在线查看 ack 手册。
银色搜索器
银色搜索器 是另一个 grep 替换工具,与 ack 类似,但声称速度更快。它会忽略在项目的 `.gitignore` 文件中找到的文件。
您可以在 OS X 上使用 Homebrew 安装银色搜索器。
brew install the_silver_searcher
您可以使用 `ag` 命令运行银色搜索器。
$ ag Controller --php
我不会详细介绍 `ag`,但如果我需要搜索大量文件(我在看你的递归 `node_modules/` 文件夹),我会尝试使用 `ag`。
Sift
Sift 是一个用 Golang 编写的 grep 替代工具,这意味着它在 Linux、Windows、OS X 和其他系统上广泛可用。它速度极快,并且具有一些可以替代 `grep + awk` 组合来提取数据的酷炫用例。
我建议您查看 示例 以了解 sift 中的功能。
使用我们在其他工具中使用的基本 PHP 搜索,以下是您在 PHP 文件中查找“Controller”的方式。
# Only PHPsift --ext php Controller # Exclude PHPsift --exclude-ext php Controller
RipGrep
RipGrep 将自己定位为与银色搜索器类似,但具有“GNU grep 的原始速度”,并且可以在 Mac、Linux 和 Windows 上运行。自述文件声称 RipGrep 通常比其他任何工具都快,它吹嘘 Rust 的正则表达式引擎,并像银色搜索器一样尊重 `.gitignore` 文件。
以下是使用 RipGrep 在 PHP 文件中搜索“Controller”的方式。
rg --type=php Controller
下一步是什么?
Ack 是我信赖的搜索工具,我认为您会发现它作为 grep 替换工具非常有用。我强烈建议您先学习如何使用 `ack`,但这些工具都有独特的特性,使其在不同的方式下都很有价值。
如果您需要搜索大量文件(我正在查看您的递归 `node_modules/` 文件夹),那么可以使用银色搜索器、Sift 或 RipGrep。在大型项目中,ack 仍然是一个相当高性能的工具,但您会注意到其他工具的速度改进。