在命令行下目录结构内的文件中搜索文本时,Linux 中有许多可用的工具。最古老和广泛使用的工具之一是 grep,它代表全局正则表达式打印。grep 存在一些问题,例如在搜索源代码文件时速度不快。还有另一个文本/模式搜索工具专门用于在源代码中搜索文本是 ack。对于依赖 shell 提示符、vi 或 emacs 等编辑器或 IDE 来编写代码的开发人员来说,一个好的搜索工具是一条生命线。
在本文中,我将介绍一些搜索工具的基础知识,这些工具可以让您在搜索文件中的文本时更轻松。
文章目录
Ack 是一个代码搜索工具,类似于 grep,但针对搜索大型源代码树的程序员进行了优化。它在纯 Perl 中运行,高度可移植,并且可以在任何运行 Perl 的平台上运行。默认情况下,ACK 递归搜索目录并默认忽略常见的版本控制目录,如 .git、.gitignore、.svn 它还忽略二进制文件、图像/音乐/视频文件、gzip/zip/tar 存档文件。ack 的输出具有更好的匹配突出显示和清晰的输出格式。
在 Ubuntu 中安装 ACK
# sudo apt-get install ack-grep
在 CentOS 中安装 ACK
# sudo yum install ack
在 Ubuntu 中,已经有一个名为“ack”的包可用,它与搜索无关。因此打包者将这个搜索工具重命名为 ack-grep。使用 apt-get 安装它后,您可以使用以下命令更改/缩短其名称以Ack。
# sudo dpkg-divert --local --divert /usr/bin/ack --rename --add /usr/bin/ack-grep
要查找在执行 ack 命令时可以使用的所有选项,请使用以下 man 命令
# man ack
Ag 也是一个类似于 ack 的代码搜索工具,但它比 ack 快得多。与 ack 相比,它可以搜索压缩文件并具有更好的编辑器(vim)集成。与 ack 一样,ag 也忽略来自 .gitignore 和 .hgignore 的文件模式。Ag 的基本用法很简单:cd 到您要搜索的目录并运行 ag blah 以查找“blah”的实例。已经发现,在源文件中搜索相同文本时,silver search 比 ack 快 34 倍。
在 Ubuntu 中安装 Ag
# sudo apt-get install silversearcher-ag
在 CentOS 中安装 Ag
# sudo yum install -y automake pcre-devel
# sudo yum install xz-devel
# cd /usr/local/src
# sudo git clone https://github.com/ggreer/the_silver_searcher.git
# cd the_silver_searcher
# sudo ./build.sh
# sudo make install
# which ag
/usr/local/bin/ag
要查找在执行 ag 命令时可以使用的所有选项,请使用以下 man 命令
# man ag
Ripgrep 是一个面向行的搜索工具,它结合了 Silver Searcher(类似于 ack)的可用性和 GNU grep 的原始速度。ripgrep 通过递归搜索当前目录的正则表达式模式来工作。ripgrep 在 Windows、Mac 和 Linux 上具有一流的支持,每个版本都可以下载二进制文件。
Ripgrep 比 Silver Searcher 和 GNU grep 都快。与 Silver Searcher 一样,ripgrep 也默认使用递归目录搜索,并且不会搜索被 .gitignore 文件忽略的文件。默认情况下,它还会忽略隐藏文件和二进制文件。Ripgrep 可以搜索特定类型的文件。例如,“rg -tpy foo”将搜索限制为 Python 文件,“rg -Tjs foo”将 JavaScript 文件排除在搜索之外。与 GNU grep 不同,ripgrep 在支持 Unicode 的同时保持快速。
在 Ubuntu/CentOS 中安装 ripgrep 二进制文件
# wget https://github.com/BurntSushi/ripgrep/releases/download/0.4.0/ripgrep-0.4.0-i686-unknown-linux-musl.tar.gz
# tar xf ripgrep-0.4.0-i686-unknown-linux-musl.tar.gz
# cd ripgrep-0.4.0-i686-unknown-linux-musl
# mv rg /usr/local/bin
# which rg
/usr/local/bin/rg
rg的用法描述在ripgrep的github页面
Sift 是另一种搜索工具,它的开发同时考虑了速度和灵活性。Sift 使用 perl 兼容的正则表达式格式,其基本选项来自 grep,但具有可用的默认值。它可以根据文件名、目录名、路径和类型选择或排除目标。像早期的搜索工具一样, sift 可以理解 .gitignore 文件,并且可以配置为仅在相关文件中显示结果。Sift 具有多行支持,并且可以替换输出以根据您的需要重新格式化,而无需依赖 awk/sed。Sift 还可以搜索 gzip 文件,并且可以处理大小>50GB 的大文件中的搜索。筛选的另一个很酷的功能是您可以在搜索文本时指定各种条件,例如 –
→在 X 行中以 A
开头 →在 X 行中后跟 B
→如果文件还包含带有 C 的行
→如果文件在前 Y 行中包含 D
→可用条件的任意组合
sift 是一个没有依赖关系的单一可执行文件,适用于所有主要平台。因此,您可以轻松地将其安装在任何平台上。
从官方 sift 站点的下载部分下载 sift,解压缩并将其移动到 PATH 环境变量指向的任何位置。
# wget https://sift-tool.org/downloads/sift/sift_0.9.0_linux_386.tar.gz
# tar xf sift_0.9.0_linux_386.tar.gz
# cd sift_0.9.0_linux_386
# mv sift /usr/local/bin
# which sift
/usr/local/bin/sift
对于 sift 的使用,请查看sift-tool.org的文档
另一个类似于 ack 和 ag 的源代码搜索实用程序是 Platinum Searcher (pt),它是一种用 Go 编程语言编写的。据称比ack快3到5倍。Pt 更安全,因为它是用内存安全语言编写的,并使用 Go 的标准 regexp 包,使其能够避免指数时间匹配。Platinum Searcher 不仅可以搜索使用 UTF-8 编码的文件,还可以搜索 EUC-JP 和 Shift_JIS,这对日本程序员来说非常有用。
安装和使用 ptPlatinum Searcher 二进制文件可从其 Github 发布页面获取用于 Windows、Mac OS X、Linux(包括 ARM)。下载二进制文件并将其移动到 $PATH 指向的位置并开始搜索。
# wget https://github.com/monochromegane/the_platinum_searcher/releases/download/v2.1.5/pt_linux_386.tar.gz
# tar xf pt_linux_386.tar.gz
# cd pt_linux_386/
# mv pt /usr/local/bin
# which pt
/usr/local/bin/pt
要在当前目录及其所有子目录中搜索模式,只需键入:
# pt PATTERN
用法:
pt [OPTIONS] PATTERN [PATH]
Application Options:
--color Print color codes in results (Enabled by default)
--nocolor Don't print color codes in results (Disabled by default)
--nogroup Don't print file name at header (Disabled by default)
-l, --files-with-matches Only print filenames that contain matches
--vcs-ignore= VCS ignore files (.gitignore, .hgignore, .ptignore)
--noptignore Don't use default ($Home/.ptignore) file for ignore patterns
--noglobal-gitignore Don't use git's global gitignore file for ignore patterns
-U, --skip-vsc-ignores Don't use VCS ignore file for ignore patterns. Still obey .ptignore
--ignore= Ignore files/directories matching pattern
-i, --ignore-case Match case insensitively
-S, --smart-case Match case insensitively unless PATTERN contains uppercase characters
-g= Print filenames matching PATTERN
-G, --file-search-regexp= PATTERN Limit search to filenames matching PATTERN
--depth= Search up to NUM directories deep (Default: 25)
-f, --follow Follow symlinks
-A, --after= Print lines after match
-B, --before= Print lines before match
-C, --context= Print lines before and after match
-o, --output-encode= Specify output encoding (none, jis, sjis, euc)
-e Parse PATTERN as a regular expression (Disabled by default)
-w, --word-regexp Only match whole words
--stats Print stats about files scanned, time taken, etc
--version Show version
Git grep 在 Git 存储库中搜索正则表达式。在某种程度上,它只是 find / grep 组合的组合,但非常简洁和快速。Git grep 是一个很棒的工具,用于查找 git 存储库中符号的所有用途和引用。安装 git 时,没有单独安装 git grep,因为它安装在旁边。
有关 git grep 的使用,请查看 git-grep手册页
很少有其他可用的搜索实用程序,如 zgrep、agrep、xmlgrep、pdfgrep 等。在我们上面讨论的所有搜索工具中,ripgrep 更快并且是跨平台的,而 silver searcher (ag) 比 Ack 更好。Grep 是用 C 编写的,但在搜索时不会忽略文件,而 Ack 是用 perl 编写的,非常擅长忽略文件。