跳到内容

烧焦的蘑菇/里脊

里格列普(rg)

ripgrep是一个面向行的搜索工具,可以递归搜索当前regex模式的目录。默认情况下,ripgrep将遵守gitignore规则并自动跳过隐藏的文件/目录和二进制文件。(要禁用默认情况下所有自动筛选,使用rg-uuu.)ripgrep有头等舱支持Windows、macOS和Linux,可下载二进制文件每一个释放.ripgrep类似于其他流行的搜索工具,如The Silver Searcher、ack和grep。

生成状态 板条箱.io 包装状态

MIT或未获得许可.

CHANGELOG公司

请参阅CHANGELOG公司获取发布历史记录。

文档快速链接

搜索结果截图

使用ripgrep进行示例搜索的屏幕截图

比较工具的快速示例

此示例搜索整个Linux内核源代码树(运行后make defconfig和make-j8)的[A-Z]+_SUSPEND(阿兹),其中所有匹配项都必须是单词。时间是在一个装有Intel的系统上收集的i9-12900K 5.2 GHz。

请记住,单个基准永远不够!查看我的ripgrep上的博客帖子与更多基准和分析进行非常详细的比较。

工具 命令 行计数 时间
ripgrep(Unicode) rg-n-w“[A-Z]+_SUSPEND” 536 0.082秒(1.00倍)
海参 hgrep-n-w“[A-Z]+_SUSPEND” 536 0.167秒(2.04倍)
吉特格里普 git grep-P-n-w'[A-Z]+_SUSPEND' 536 0.273秒(3.34倍)
白银搜索者 ag-w“[A-Z]+_SUSPEND” 534 0.443秒(5.43倍)
ugrep公司 ugrep-r--忽略文件--no-hidden-I-w'[A-Z]+_SUSPEND' 536 0.639秒(7.82倍)
吉特格里普 LC_ALL=C git grep-E-n-w'[A-Z]+_SUSPEND' 536 0.727秒(8.91x)
git-grep(Unicode) LC_ALL=en_US.UTF-8数字grep-E-n-w'[A-Z]+_SUSPEND' 536 2.670秒(32.70倍)
ack(确认) ack-w“[A-Z]+_SUSPEND” 2677 2.935秒(35.94倍)

下面是对上述相同语料库的另一个基准测试,它忽略了gitinore而是使用白名单进行文件和搜索。语料库与上一个基准,传递给每个命令的标志确保做同等工作:

工具 命令 行计数 时间
撕裂 rg-uuu-tc-n-w“[A-Z]+_SUSPEND” 447 0.063秒(1.00倍)
ugrep公司 ugrep-r-n--include='*.c'--include='*.h'-w'[A-Z]+_SUSPEND' 447 0.607秒(9.62倍)
GNU grep公司 grep-E-r-n--include='*.c'--include='*.h'-w'[A-Z]+_SUSPEND' 447 0.674秒(10.69倍)

现在我们将转到搜索单个大文件。这是一条直尺在内存中缓存的文件上比较ripgrep、ugrep和GNU grep(约13GB,打开字幕.raw.en.gz,解压缩):

工具 命令 行计数 时间
ripgrep(Unicode) rg-w“夏洛克[A-Z]\w+” 7882 1.042秒(1.00倍)
ugrep公司 ugrep-w“夏洛克[A-Z]\w+” 7882 1.339秒(1.28倍)
GNU grep(Unicode) LC_ALL=en_US.UTF-8白鹭-w“夏洛克[A-Z]\w+” 7882 6.577秒(6.31x)

在上述基准中,通过-n个标志(用于显示行号)将时间增加到1.664秒对于ripgrep和9.484秒对于GNU grep。ugrep公司时间不受以下因素的影响-n个.

但要小心性能悬崖:

工具 命令 行计数 时间
ripgrep(Unicode) rg-w“[A-Z]\w+夏洛克[A-Z]\w+” 485 1.053秒(1.00倍)
GNU grep(Unicode) LC_ALL=en_US.UTF-8 grep-E-w’[A-Z]\w+夏洛克[A-Z]\w+' 485 6.234秒(5.92倍)
ugrep公司 ugrep-w“[A-Z]\w+夏洛克[A-Z]\w+” 485 28.973(27.51倍)

而且,在进行大型搜索时,性能可能会全面急剧下降没有任何文字优化机会的模式文件:

工具 命令 行计数 时间
撕裂 rg“[A-Za-z]{30}” 6749 15.569秒(1.00倍)
ugrep公司 ugrep-w“[A-Z]\w+夏洛克[A-Z]\w+” 6749 21.857秒(1.40倍)
GNU格雷普 LC_ALL=C grep-E'[A-Za-z]{30}' 6749 32.409秒(2.08倍)
GNU grep(Unicode) LC_ALL=en_US.UTF-8 grep-E'[A-Za-z]{30}' 6795 8毫米30秒(32.74倍)

最后,高匹配次数也有助于坦克性能和流畅性找出工具之间的差异(因为性能取决于快速处理匹配,而不是检测匹配的算法,一般来说):

工具 命令 行计数 时间
撕裂 rg的 83499915 6.948秒(1.00倍)
ugrep公司 ugrep的 83499915 11.721秒(1.69倍)
GNU grep公司 LC_ALL=清除 83499915 15.217秒(2.19倍)

为什么我应该使用ripgrep?

  • 它可以取代其他搜索工具提供的许多用例因为它包含了它们的大部分功能,并且通常速度更快。(请参见常见问题解答有关ripgrep能否真正替换GRP.)
  • 与其他专门用于代码搜索的工具一样,ripgrep默认为递归搜索而且确实如此自动的过滤也就是说,ripgrep不会搜索文件被您的忽略.gitignore(.git忽略)/.忽略/.乔治诺尔文件,它不会搜索隐藏文件,它不会搜索二进制文件。自动过滤可以使用禁用右-右.
  • 拉格利普罐搜索特定类型的文件.例如,rg-tpy foo将搜索限制为Python文件和rg-Tjs foo从搜索中排除JavaScript文件。ripgrep可以被教具有自定义匹配规则的新文件类型。
  • ripgrep支持中的许多功能格雷普,例如显示上下文搜索结果的,搜索多个模式,突出显示匹配项颜色和完整的Unicode支持。与GNU grep不同,ripgrep在支持Unicode(始终打开)。
  • ripgrep可选地支持将其正则表达式引擎切换为使用PCRE2。除其他外,这使得使用look-around和模式中的反向引用,这在ripgrep的默认设置中不受支持正则表达式引擎。可以使用启用PCRE2支持-P/--第2部分(使用PCRE2始终)或--自动混合重凝胶(仅在需要时使用PCRE2)。另一种选择语法通过--引擎(默认|pcre2|auto-hybrid)选项。
  • ripgrep有更换的基本支持,允许根据匹配的内容重写输出。
  • ripgrep支架在文本编码中搜索文件除UTF-8外,如UTF-16、latin-1、GBK、EUC-JP、Shift_JIS等。(提供了一些自动检测UTF-16的支持。其他文本编码必须用-E/--编码标志。)
  • ripgrep支持搜索以通用格式压缩的文件(brotli、,bzip2、gzip、lz4、lzma、xz或zstandard)-z/--搜索zip标志。
  • ripgrep支架任意输入预处理滤波器可能是PDF文本提取,不太受支持的解压缩、解密,自动编码检测等。
  • ripgrep可以通过配置文件.

换句话说,如果你喜欢速度,可以使用ripgrep,默认情况下过滤更少错误和Unicode支持。

为什么我不应该使用ripgrep?

尽管最初不想将所有功能都添加到ripgrep中,随着时间的推移,ripgrep已经增加了对其他文件中大多数功能的支持搜索工具。这包括搜索跨多个行,以及对PCRE2的opt-in支持,它提供了look-around和反向引用支持。

在这一点上,不使用ripgrep的主要原因可能有一个或以下多种情况:

  • 你需要一个便携且无处不在的工具。虽然ripgrep在Windows上工作,macOS和Linux,它不是无所不在的,也不符合任何POSIX等标准。这项工作最好的工具是好的旧grep。
  • 本自述文件中仍存在一些未列出的其他功能(或错误)你依赖于另一个不在ripgrep中的工具。
  • 在一个性能优势案例中,ripgrep在另一个方面做得不好这个工具做得很好。(请提交错误报告!)
  • ripgrep无法安装在您的计算机上,或者无法用于您的平台。(请提交错误报告!)

它真的比其他东西都快吗?

一般来说,是的。对每个基准进行详细分析的大量基准是可以在我的博客上找到.

总之,ripgrep速度很快,因为:

  • 它建在Rust的regex引擎.Rust的正则表达式引擎使用有限自动机、SIMD和攻击性文字使搜索速度极快的优化。(可以选择PCRE2支持使用-P/--百分比2标志。)
  • Rust的正则表达式库通过以下方式在完全支持Unicode的情况下保持性能将UTF-8解码直接构建到其确定性有限自动机中发动机。
  • 它支持使用内存映射或增量搜索进行搜索带有中间缓冲器。前者更适合单个文件,而后者更适合大目录。ripgrep选择最佳搜索自动为您制定战略。
  • 在中应用忽略模式.gitignore(.git忽略)文件使用RegexSet(正则集合).这意味着一个文件路径可以与多个全局模式匹配同时。
  • 它使用了一个无锁并行递归目录迭代器,由横梁忽视.

功能比较

Andy Lester,《》的作者ack(确认),已发布比较ack、ag、git-grep、GNU grep和ripgrep(撕裂):https://beyondgrep.com/feature-comparison/

请注意,ripgrep最近增加了一些重要的新功能还没有出现在安迪的桌子上。这包括但不限于:,配置文件、passthru、支持搜索压缩文件、,通过PCRE2支持多行搜索和opt-in花式正则表达式。

游乐场

如果您想在安装之前尝试ripgrep,有一个非官方的操场和一个交互式辅导的.

如果您对此有任何疑问,请在辅导的回购.

安装

ripgrep的二进制名称为rg公司.

ripgrep的预编译二进制文件档案可用于Windows,macOS和Linux。Linux和Windows二进制文件是静态可执行文件。平台用户未明确建议下载以下提到的其中一个档案。

如果你是macOS自制软件或aLinuxbrew公司用户,然后您可以安装ripgrep来自自制内核:

$brew安装ripgrep

如果你是MacPorts公司用户,然后可以从官方港口:

$sudo端口安装ripgrep

如果你是Windows巧克力用户,然后可以从官方回购:

$choco安装ripgrep

如果你是Windows独家新闻用户,然后可以从官方水桶:

$spop安装ripgrep

如果你是Windows Winget(Windows Winget)用户,然后可以从翼-包装存储库:

$winget安装BurntShoshi.ripgrep。MSVC公司

如果你是体系结构Linux用户,然后可以从官方repo安装ripgrep:

$sudo pacman-S ripgrep

如果你是Gentoo公司用户,您可以从官方回购:

$sudo-emerge-sys-apps/ripgrep

如果你是费多拉用户,您可以从官方安装ripgrep存储库。

$sudo dnf安装ripgrep

如果你是打开SUSE用户,ripgrep包含在openSUSE风滚草openSUSE跳跃自15.1起。

$sudo zypper安装ripgrep

如果你是RHEL/CentOS 7/8号用户,您可以从安装ripgrep铜比:

$sudo yum安装-y yum-utils$sudo yum-config-manager--添加-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/epel-7/carlwgeoge-ripgrep-7.repo$sudo yum安装ripgrep

如果你是尼克斯用户,您可以从安装ripgrep尼克斯队:

$nix-env—安装ripgrep

如果你是弗洛克斯用户,您可以按如下方式安装ripgrep:

$flox安装ripgrep

如果你是吉他用户,您可以从官方安装ripgrep程序包集合:

$guix安装ripgrep

如果你是Debian公司用户(或类似Debian衍生物的用户Ubuntu公司),然后可以使用二进制文件安装ripgrep.deb(代布)每个文件中提供的文件ripgrep释放.

$curl-低https://github.com/BurntShoshi/ripgrep/releases/download/14.1.0/ripgrep_14.1.0-1_amd64.deb$sudo dpkg-i ripgrep_14.1.0-1_amd64.deb

如果您运行Debian stable,ripgrep是正式维护人Debian公司,尽管其版本可能黛布上一步中提供的包。

$sudo apt-get安装ripgrep

如果你是Ubuntu Cosmic(18.10)(或更新)用户,ripgrep是可获得的使用相同的打包为Debian:

$sudo apt-get安装ripgrep

(注意:Ubuntu上的ripgrep也有各种快照,但都没有似乎工作正常,生成了许多非常奇怪的错误报告不知道如何修复,也没有时间修复。因此,它不是建议的安装选项更长。)

如果你是中高音用户,您可以从官方回购:

$sudo apt-get安装ripgrep

如果你是自由BSD用户,然后可以从官方港口:

$sudo-pkg安装ripgrep

如果你是OpenBSD(打开BSD)用户,然后可以从官方港口:

$doas pkg_添加ripgrep

如果你是NetBSD公司用户,然后可以从安装ripgreppkgsrc公司:

$sudo-pkgin安装ripgrep

如果你是海口x86_64用户,然后您可以从官方港口:

$sudo-pkgman安装ripgrep

如果你是海口x86_gcc2用户,然后可以从与使用x86二级架构构建的Haiku x86_64相同的端口:

$sudo-pkgman安装ripgrep_x86

如果你是无效Linux用户,然后可以从官方存储库:

$sudo xbps安装-Syv ripgrep

如果你是Rust程序员,ripgrep可以与一起安装货物.

  • 请注意,ripgrep支持的Rust的最低版本为1.72.0,尽管ripgrep可能适用于旧版本。
  • 注意,二进制文件可能比预期的要大,因为它包含调试符号。这是故意的。删除调试符号并因此减少文件大小,运行在二进制文件上。
$cargo安装ripgrep

或者,可以使用货柜安装ripgrep直接来自GitHub的二进制文件:

$货柜ripgrep

建筑物

ripgrep是用Rust写的,所以你需要抓取一个生锈安装为了编译它。ripgrep可与Rust 1.72.0(稳定)或更新版本兼容。一般来说,ripgrep轨道Rust编译器的最新稳定版本。

要构建ripgrep:

$git克隆https://github.com/BurntShoshi/ripgrep$cd撕裂$cargo构建--发布$ ./target/release/rg--版本0.1.3

注:过去,ripgrep支持simd-accel(模拟加速)货物特征使用Rust夜间编译器。这只对UTF-16转码有利。因为它需要不稳定的特性,所以这种构建模式很容易被破坏。因此,对它的支持已被移除。如果需要SIMDUTF-16转码的优化,那么您必须申请编码项目使用稳定API。

最后,通过启用百分比2功能:

$cargo构建-发布-功能“pcre2”

启用PCRE2功能与稳定的Rust编译器一起工作尝试通过自动查找并链接系统的PCRE2库pkg配置。如果不存在,则ripgrep将从源代码构建PCRE2使用系统的C编译器,然后将其静态链接到final可执行文件。即使有可用的PCRE2,也可以强制进行静态链接通过使用MUSL目标构建ripgrep或通过设置PCRE2_SYS_STATIC=1.

通过首先安装MUSL,可以在Linux上使用MUSL目标构建ripgrep系统上的库(咨询友好的邻里套餐经理)。然后您只需要将MUSL支持添加到Rust工具链并重新构建ripgrep,它生成一个完全静态的可执行文件:

$rustup目标add x86_64未知-linux-musl$cargo构建--发布--目标x86_64未知-linux-musl

应用--功能上面的旗子按预期工作。如果你想使用MUSL和PCRE2构建一个静态可执行文件,然后需要musl-gcc公司已安装,它可能与实际的MUSL库,具体取决于您的Linux发行版。

运行测试

ripgrep经过了相对良好的测试,包括单元测试和集成测验。要运行完整测试套件,请使用:

$货物测试--全部

从存储库根目录。

相关工具

  • 三角洲是语法突出显示支持rg—json输出格式。所以你需要做的就是让它工作是rg—json模式|增量。请参阅delta的手动部分格雷普了解更多详细信息。

漏洞报告

要报告安全漏洞,请联系Andrew Gallant.如果您想发送加密消息。

翻译

以下是ripgrep文档的已知翻译列表。这些非官方维护,可能不是最新的。