6 个 Linux 中优秀搜索工具

在命令行下目录结构内的文件中搜索文本时,Linux 中有许多可用的工具。最古老和广泛使用的工具之一是 grep,它代表全局正则表达式打印。grep 存在一些问题,例如在搜索源代码文件时速度不快。还有另一个文本/模式搜索工具专门用于在源代码中搜索文本是 ack。对于依赖 shell 提示符、vi 或 emacs 等编辑器或 IDE 来编写代码的开发人员来说,一个好的搜索工具是一条生命线。

在本文中,我将介绍一些搜索工具的基础知识,这些工具可以让您在搜索文件中的文本时更轻松。

  • Ack
  • Ag
  • Ripgrep
  • Git grep
  • Sift
  • Platinum searcher

Ack

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

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 (rg)

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 是另一种搜索工具,它的开发同时考虑了速度和灵活性。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的文档

Pt

另一个类似于 ack 和 ag 的源代码搜索实用程序是 Platinum Searcher (pt),它是一种用 Go 编程语言编写的。据称比ack快3到5倍。Pt 更安全,因为它是用内存安全语言编写的,并使用 Go 的标准 regexp 包,使其能够避免指数时间匹配。Platinum Searcher 不仅可以搜索使用 UTF-8 编码的文件,还可以搜索 EUC-JP 和 Shift_JIS,这对日本程序员来说非常有用。

安装和使用 pt

Platinum 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 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 编写的,非常擅长忽略文件。

Bash脚本中逐行读取文件
压缩Jekyll 的最终 HTML文件
标签:

发表我的评论

电子邮件地址不会被公开。 必填项已用*标注

58 + 93 =

ajax-loader