Ugrep:更快的模糊交互grep

2020-08-10 14:34:18

可移植(Linux、Unix、MacOS、Windows等),发行版中包括用于Windows的x86和x64二进制文件。

超快的新匹配算法,轻松击败grep、ripgrep、Silver Search、Hyperscan、SIFT等请参阅性能基准。

用户友好,ug命令使用合理的默认值和可定制的配置文件,该命令与ugrep--config相同,可以使用您的首选项加载.ugrep配置文件。

搜索档案(cpio、jar、tar、pax、zip)和压缩文件(zip、gz、z、bz、bz2、lzma、xz、lz4)的内容。

Ugrep--filter=&39;pdf:pdftotext%-';模式...ugrep--filter=';odt,doc,docx,rtf,xls,xlsx,ppt,pptx:soffice--headless--cat%&39;模式...ugrep--filter=';pem:openssl x509-text,ce,crt,der:openSSL x509-text-info。

搜索二进制文件并显示具有二进制模式匹配的十六进制转储(Unicode文本或原始字节模式)。

Ugrep-W TEXTPATTERN...。UGREP-X TEXTPATTERN...UGREP-W-U BYTEPATTERN...。UGREP-X-U BYTEPATTERN...。

包括要按文件类型或文件幻字节数搜索的文件,或使用^将其排除

Ugrep-t型图案...。Ugrep-t^型图案...ugrep-M&39;Magic图案...。Ugrep-M&39;^魔术图案...。

包括文件和目录,以搜索与gitignore样式全局匹配文件和目录,或使用^将其排除。

Ugrep-g';FILEGLOB&39;图案...。Ugrep-g&39;^FILEGLOB&39;Pattern...ugrep-g&39;DIRGLOB/&39;Pattern...。Ugrep-g&39;^DIRGLOB/&39;Pattern...ugrep-g&39;path/FILEGLOB&39;Pattern...。Ugrep-g';^PATH/FILEGLOB';Pattern...ugrep-g&39;PATH/DIRGLOB/&39;Pattern...。Ugrep-g&39;^路径/目录模式...。

包括预定义的regex模式,用于搜索源代码、javascript、XML、JSON、HTML、PHP、markdown等。

Ugrep pattern-f c++/zap_Comments-f c++/zap_string...ugrep pattern-f php/zap_html...ugrep-f js/函数...|ugrep pattern...。

Ugrep--排序模式...。Ugrep--SORT=大小模式...ugrep--SORT=更改的模式...。Ugrep--SORT=已创建的模式...ugrep-Z--SORT=最佳模式...。

Ugrep--CSV模式..。Ugrep--json模式...ugrep--XML模式...。Ugrep--format=';文件=%f行=%n匹配=%O%~';模式...。

搜索与多行匹配的模式,即模式可能包含一个或多个\n换行符

这将安装ugrep和ug命令,其中ug与ugrep相同,但当配置文件.ugrep出现在工作目录或主目录中时,它还会加载配置文件.ugrep。

如果您还需要ug命令,请将ugrep.exe复制到ug.exe,该命令会在工作目录或主目录中存在时加载.ugrep配置文件。

将ugrep.exe和ug.exe添加到您的执行路径:转到“设置”,然后在“查找设置”中搜索";路径";。选择环境变量->;path->;New,然后添加放置ugrep.exe和ug.exe可执行文件的目录。

在命令行上引用模式和参数时,不要使用单引号,而要使用单引号;大多数Windows命令实用程序都会考虑命令行参数的单引号部分!

当指定空模式来匹配所有输入时,某些Windows命令解释程序(如Powershell)可能会忽略这一点,在这种情况下使用option--Match。

选项-P(Perl正则表达式)需要PCRE2库(首选)或Boost.Regex库。如果未安装PCRE2,请使用例如sudo apt-get install-y libpcre2-dev或下载PCRE2并按照安装说明安装PCRE2。或者,下载Boost.Regex并运行./bootstrap.sh和sudo./b2--with-regex install。请参阅Boost:快速入门。

选项-z(压缩文件和归档搜索)需要安装zlib库。它安装在大多数系统上。如果没有,请安装它,例如使用sudo apt-get install-y libz-dev.要搜索.bz和.bz2文件,请安装bzip2库,例如使用sudo apt-get install-y libbz2-dev。要搜索.lzma和.xz文件,请安装lzma库,例如使用sudo apt-get install-y liblzma-dev。要搜索.lz4文件,请安装lz4库,例如使用sudo apt-get install-y liblz4-dev。

某些Linux系统可能未配置为从/usr/local/lib加载动态库,从而导致在运行ugrep时出现库加载错误。要纠正这一点,请将导出LD_LIBRARY_PATH=";$LD_LIBRARY_PATH:/usr/local/lib";添加到~/.bashrc文件。或者运行sudo ldconfig/usr/local/lib。

这将使用./configure--enable-color和make-j在ugrep/src目录中构建ugrep可执行文件,并使用make test进行验证。所有测试通过后,ugrep可执行文件将复制到ugrep/bin/ugrep,并为ug命令添加symlink ugrep/bin/ug->;ugrep/bin/ugrep。

请注意,ug与ugrep相同,但是当ug出现在工作目录或主目录中时,它还会加载配置文件.ugrep。这意味着您可以在.ugrep中定义ug的默认选项。

构建完成后,将ugrep/bin/ugrep和ugrep/bin/ug复制到方便的位置,例如~/bin目录中。

这还会安装带有预定义模式的模式文件,用于选项-FAT/usr/local/share/ugrep/Patterns/。选项-f首先检查工作目录中是否存在模式文件,如果没有找到,则检查环境变量GREP_PATH以加载模式文件,如果没有找到,则读取已安装的预定义模式文件。

遗憾的是,Git克隆不保留时间戳,这意味着您可能会遇到警告:';aclocal-1.15';在您的系统上丢失。";或者在运行make时找不到自动标题。

开发人员可能希望在进行重大更改时使用杀菌器来验证ugrep代码,例如检测与ThreadSaniizer的数据竞争:

我们用clang AddressSaniizer、MemorySaniizer、ThreadSaniizer和UnfinedBehaviorSaniizer检查了ugrep。这些选项会带来巨大的运行时开销,不应用于最终构建。

Ugrep是多线程的,并使用巧妙的无锁作业队列窃取来优化负载平衡。我们还使用AVX2/512BW、SSE2和ARM NEON/AArch64指令优化了正则表达式匹配。压缩文件在搜索的同时被同时解压缩,以进一步提高性能。实现异步IO以实现高效的输入和输出。

从Qt 5.9.2根目录对目录树中的#include";...";进行多线程递归搜索,限制为.h、.hpp和.cpp。

注意:T10和T11使用ugrep选项-oh,hpp,cpp将搜索限制为扩展名为.h、.hpp和.cpp的文件,应使用GNU/BSD/PCRGE grep表示为--include=';*.h';--include=';*.hpp';--include=';*.cpp';,使用Silver Search as-G';需要--搜索-二进制文件来搜索压缩文件(错误),并使用--glob=';*.h';--glob=';*.hpp';--glob=';*.cpp';。

性能测试是在一台2.9 GHz Intel Corei7、16 GB 2133 MHz LPDDR3 Mac OS 10.12.6机器上使用clang 9.0.0-O2的MacOSX进行的。在机器负载最小的情况下,显示了至少30次运行的最佳时间。

结果以实时(挂钟时间)秒数显示。最佳时间以粗体显示,n/a表示运行时间超过1分钟或不支持所选选项(例如,选项-z)。

注意:Silver Searcher2.2.0在多线程(T10 0.45s)下的运行速度比单线程(T11 0.32s)慢,这是向维护人员报告的一个问题。

由于其报告的所有匹配都是模式匹配行为,Hyperscan simple greprep比其他grep多转换几个匹配项。选项-w使用模式\b(char|int|long|size_t|void)\b模拟。选项-f模拟如下:

注意:输出被发送到空实用程序,以消除终端显示开销。空实用程序源代码:

#include<;sys/tyes.h>;#include<;sys/uio.h>;#include<;unistd.h>;int main(){char buf[65536];While(Read(0,buf,65536)>;0)Continue;}

注意:性能结果取决于热/冷运行、编译器、库、Theos、CPU类型和文件系统延迟。然而,在许多其他类型的机器上也获得了类似的竞争结果。

首先,让我们在Vim中定义:grep命令来递归搜索文件。要执行此操作,请将以下行添加到根目录中的.vimrc文件中:

这使用Vim:grep命令指定不区分大小写的搜索。对于区分大小写的搜索,请从grepprg中删除\-j。同一行上的多个匹配项分别列在快速修复窗口中。如果这不是所需的,请从grepprg中删除\-u。使用此更改,只显示一行上的第一个匹配。选项--Ignore-files跳过.gitignore文件中指定的文件(如果存在)。要将递归搜索的深度限制为仅限于当前目录,请将\1\f25\1\f6追加到-1\f25 grepprg-1\f6。

现在可以调用Vim中的Vim:grep命令在指定路径上的文件中搜索模式匹配:

如果省略path,则搜索工作目录。使用%作为PATH仅搜索Vim中当前打开的文件:

:grep命令在快速修复窗口中显示结果,该窗口允许您快速跳转到找到的匹配项。

双击此窗口中的一行(或选择一行并按Enter键)跳转到匹配的文件和文件中的位置。输入Commands:cnand:cp分别跳到下一个或上一个匹配。要更新QuickFix窗口中的搜索结果,只需对它们进行grep即可。例如,要递归搜索工作目录中标记为FIXME的C++源代码:

您可以将ugrep选项与:grep命令一起使用,例如选择当前文件中的单行和多行注释:

快速修复中只显示多行注释的第一行,以保存空间。要显示多行匹配的所有行,请从grepformat中删除%-G。

这些选项是可选的,可以省略:-i跳过二进制文件,选项--Ignore-files跳过.gitignore文件中指定的文件(如果存在),选项-3将搜索目录限制在三个级别(工作目录及其以下最多两个级别)。

Grep=ugrep--SORT-G-U-Y-。-Dread-dreadegrep=ugrep--排序-E-U-Y-。-Dread-dreadfgrep=ugrep--SORT-F-U-Y-。-Dread-dreadzgrep=ugrep--SORT-G-U-Y-Z-。-Dread-dreadzegrep=ugrep--SORT-E-U-Y-Z-。-Dread-dreadzfgrep=ugrep--SORT-F-U-Y-Z-。-恐惧-恐惧。

当ugrep(或ugrep.exe)可执行文件重命名为grep(grep.exe)、egrep(egrep.exe)、fgrep(fgrep.exe)等时,上面显示的选项子集将自动生效,但--SORT、-DREAD、-DREAD和-U除外,以允许Unicode匹配。例如,当ugrep重命名为egrep时,选项-E、-Y和-。会自动启用。

请注意,某些grep选项的默认设置可能会有所不同,以使ugrep更加用户友好,请参阅对grep的显著改进。

别名UQ=';ug-q';#Short&;快速查询UI(交互式,使用.ugrep config)别名UX=';ug-UX';#Short&;快速二进制模式搜索(使用.ugrep config)别名uz=';ug-z';#Short&;快速压缩文件和档案搜索(使用.ugrep config)别名UGIT=';ug。在.ugrep configalias grep=';ugrep-G';#Search with Basic Regular Expression(BRE)alias egrep=';ugrep-E';#Search with Extended Regular Expression(Ere)alias fgrep=';ugrep-F';#find string(S)alias pgrep=';ugrep-P';#Search With Perl Regular Expression(ERE)alias fgrep=';ugrep-F';#find string(S)alias pgrep=';ugrep-P';#Search with Perl Regular Expression。Ugrep-zg&#使用BREalias zegrep=';ugrep-ze';#搜索压缩文件和档案使用EREalias zfgrep=';ugrep-ZF';#在压缩文件和/或档案中查找字符串别名为zpgrep=';ugrep-ZP';#使用Perl正则表达式saulas zxas搜索压缩文件和档案。";';#不搜索的十六进制转储文件。

要自动搜索PDF和Office文档,请向带别名的ugrep命令添加筛选器选项:

Ugrep正则表达式模式比GNU、GREP和BSD、GREP、POSIX更具表现力,并且支持Unicode模式匹配和大部分PCRE语法。扩展正则表达式(ERE)语法是默认语法(即选项-E,如egrep,而-G启用BRE)。

Ugrep使用-W(以十六进制输出二进制匹配,与通常一样输出文本匹配)和-X(以十六进制输出所有匹配)生成十六进制转储。

Ugrep搜索pdf、doc、docx、xls、xlsx、epub以及更多--filter使用第三方格式转换实用程序作为插件。

Ugrep提供负模式-N模式,这是(^X)形式的模式,用于跳过与X匹配的输入。负模式可用于在搜索源代码中的标识符时跳过字符串和注释,并在字符串和注释中查找不匹配的字符串和注释。预定义的ZAP模式使用否定模式,例如,使用-fcpp/zap_comments忽略C++注释中的模式匹配。

Ugrep选项-f使用GREP_PATH环境变量或安装在/usr/local/share/ugrep/pattern中的预定义模式。如果指定了-f,并且还指定了一个或多个-e模式,则选项-F、-x和-w不适用于-f模式。这是为了避免在将-f与可能不再与这些选项一起正常工作的预定义模式一起使用时产生混淆。

Ugrep选项-O、-M和-t分别指定文件扩展名、文件签名幻字节模式和预定义的文件类型。这允许在目录树中搜索特定类型的文件,例如,使用递归搜索选项-R和-r。选项-O、-M和-t也适用于cpio、jar、pax、tar和zip文件中的归档文件。

Ugrep选项-k,--column-number显示列号,按照选项--tabs的指定,通过展开制表符来考虑制表符间距。

Ugrep选项-P(Perl正则表达式)支持反向引用(带有--format)和lookbehinds,后者使用PCRE2或Boost.Regexlibrary与类似PCRE的语法进行快速Perl正则表达式匹配。

Ugrep选项-b使用选项-o或使用选项-u时,ugrep显示模式匹配的确切字节偏移量,而不是GNU/BSD grep报告的匹配行开始的字节偏移量。

Ugrep选项-u,--ungroup以不对每行的匹配项进行分组。此选项为该行上的每个附加模式匹配再次显示匹配的输入行。此选项与选项-c一起报告每个文件的模式匹配总数,而不是每个文件匹配的行数,这一点特别有用。

Ugrep选项-Y启用匹配空模式。使用空匹配模式进行grep很奇怪,并且使用GNU grep和使用BSD grep会产生不同的结果。默认情况下,ugrep不输出空匹配,这会避免出错,从而可能产生随机结果。例如,使用GNU/BSD grep,模式a*匹配输入中的每一行,实际上匹配xyz三次(x、y和z之前和之间的空转换)。允许空匹配需要ugrep选项-Y。通过隐式启用-Y,允许以^开头、以$结尾的Patterns匹配空,例如^\h*$。

默认情况下,ugrep选项-D,--device=action是跳过,而不是读取。这可以防止意外挂起递归搜索的目录中的命名管道,就像默认读取设备的GNU/BSD grep可能发生的那样。

默认情况下,ugrep选项-d,--directory=action是跳过,而不是读取。默认情况下,将搜索命令行上指定的目录,但不会递归深入到子目录。

Ugrep不使用.greprc配置文件或GREP_OPTIONS环境变量,因为ugrep的行为必须在每个系统上都是可移植和可预测的,而不必将配置文件复制到每个系统。出于这个原因,GNU grep也放弃了GREP_OPTIONS。取而代之的是,请使用shell别名来创建具有特定搜索选项的新命令。

要使用位于workingdirectory或home目录中的配置文件.ugrep执行搜索(请注意,ug与ugrep--config相同):

要将.ugrep配置文件保存到工作目录,然后编辑主目录中的此文件以自定义ug默认值的首选项:

要搜索工作目录并递归深入地查找main(请注意,如果未指定文件参数,则默认情况下启用-R Recurse符号链接):

同样,使用交互式查询UI,从初始搜索模式main开始(请注意,带有初始模式的-q需要选项-e,因为通常以交互方式指定字符,并且所有命令行参数都被视为文件/目录):

要在C++文件中使用正则表达式模式搜索#DEFINE(和#DEFINE等)(请注意,应该用引号将模式引起来,以防止*和?的shell替换):

要在目录myproject中递归搜索main作为单词(-w)而不跟随符号链接(-r),并在匹配的行旁显示匹配的行(-n)和列(-k)编号,请执行以下操作:

相同,但仅搜索myproject,不进行更深入的递归(请注意,默认情况下在一个级别搜索directory参数):

相同,但也可以在归档(例如zip和tar文件)中搜索,并使用-z压缩文件:

递归搜索Main的工作目录,同时忽略gitignoredfiles(例如,假设.gitignore位于工作目录或其下):

要列出.gitignore文件未忽略的工作目录和更深层中的所有文件,请执行以下操作:

要显示根据-t参数搜索的文件扩展名和幻字节(Shebangs)的列表,请执行以下操作:

要根据扩展名和带-l的Shebangs递归列出所有shell文件(请注意,';';匹配任何非空文件):

要在源代码中搜索Main,同时忽略字符串和注释块,我们可以使用带有选项-N的否定模式跳过不需要的匹配项Inc/C++引号的字符串和注释块:

要正确键入这是一项很大的工作!如果你和我一样,当我在做更重要的事情时,我不想花时间摆弄正则表达式模式。使用随ugrep工具安装的ugrep预定义模式(-f)有一种更简单的方法:

此查询还搜索C/C++源代码以外的其他文件,如Readme、Makefile等。我们还跳过了带有-r的符号链接。Solet通过仅使用选项-tc、c++选择C/C++文件并使用-R:包括指向文件和目录的符号链接来优化此查询:

如果我们只查找标识符main,而不是将其作为函数main(?),该怎么办?为此,我们可以使用否定模式跳过不需要的Main\h*(模式匹配:

这使用-e和-N选项分别显式指定模式和负模式,这实质上形成了模式main|(?^main\h*\(),其中\h匹配空格和制表符。一般来说,否定模式对于过滤掉我们不感兴趣的模式匹配很有用。

作为另一个例子,我们可能想要在C/C++注释块中搜索单词Fixme。为此,我们可以首先使用ugrep';预定义的c/Comments模式选择注释块,然后使用apipe使用Fixme选择行:

使用管道过滤结果通常比使用某些搜索工具使用的AND-OR逻辑更容易。这种方法遵循Unix精神,使实用程序保持简单,并将它们组合使用来完成更复杂的任务。

假设我们想要生成Java source code中找到的所有标识符的排序列表,同时跳过字符串和注释:

使用传统的grep和grep。

.