解锁在Windows中使用这些grep等效工具的力量

厌倦了在您的计算机上使用像grep这样的老式搜索工具吗?为什么要妥协呢?Windows中有许多grep等效工具可以帮助您精确搜索所需的内容。

在本教程中,您将学习这些grep等效工具如何使得在文件中更快地搜索,并在一瞬间找到所需的信息。

请继续关注并结交强大的搜索工具!

先决条件

本教程包括实践演示。要跟着做,请确保您已准备好以下内容:

  • A Window machine – This tutorial uses Windows 10 PC, but any version of Windows will suffice.
  • PowerShell – 本教程使用PowerShell 7.2.8。
  • scoop – 本教程使用scoop v0.3.1。

在文件中查找特定文本字符串(findstr

能够立即发现文件中您正在寻找的特定字符串(具有特定模式)极大地有助于您的工作流程。但是如何做到?转向Windows中的findstr命令行实用程序,它允许您在文件中搜索特定的文本字符串。

findstr在Windows中通常被用作类似Unix grep命令的等价物,因为它具有与其相似的功能。使用findstr有哪些好处?一个例子是它内置于任何Windows操作系统(OS)中,无需额外的软件。

要在文件中查找特定字符串,请按照以下步骤操作:

使用您喜欢的文本编辑器创建一个文本文件,将其命名为notes.txt,并将下面的内容填充到文件中。

Hello, world. This is an example of a text file.
I am writing some notes in this file.
Here are some keywords to search for: apple banana cherry.

现在,以管理员身份打开PowerShell,并运行下面的命令在notes.txt文件中查找字符串(findstr)匹配搜索模式(”apple")的命令。

? findstr有许多参数可用于自定义搜索。但在本教程中,您将探索一些在文件中搜索字符串时最有价值的参数。

findstr "apple" "C:\\myfiles\\notes.txt
Searching text strings with the word apple in it

? 也许您正在多个文件中搜索字符串。如果是这样,请指定由空格分隔的文件路径,如下所示:findstr parameters "pattern" "C:\\path\\to\\file1.txt" "C:\\path\\to\\file2.txt"

查找与特定模式或文字匹配的字符串

当处理配置文件时,查找特定模式或字面字符串非常关键,特别是在调试过程中。幸运的是,/c参数告诉findstr命令搜索与指定模式匹配的字面字符串,包括任何空格或特殊字符。

/c参数附加到findstr命令对以下情况非常有用,但不限于:

  • 搜索以特定顺序出现的特定短语或一组单词。
  • 搜索包含空格或特殊字符的字符串。

要查看/c参数如何实际运作,请按照以下步骤进行:

1. 运行下面的findstr命令,以在*notes.txt*文件中搜索字面字符串(/c)banana cherry

findstr /c:"banana cherry" "C:\myfiles\notes.txt"

在下面的输出中,findstr命令仅返回包含精确字符串banana cherry的行,并在两个单词之间有一个空格。

请记住,/c参数区分大小写,因此findstr命令仅返回与您指定的确切字母大小写相匹配的字符串。如果notes.txt文件中的任何字符串不匹配指定的模式,则findstr命令将返回空白输出。

Searching for a literal string

2. 接下来,将以下行添加到notes.txt文件中,并保存更改。

在您的 `notes.txt` 文件中,此时应该有两行包含字符串“hello”的内容。一行是全小写的(hello, world.),另一行是首字母大写的(Hello, world.)。

hello, world.

3. 现在,请运行以下每个命令来搜索 `notes.txt` 文件中的 hello, worldHello, world 字符串。

# 所有小写模式
findstr /c:"hello, world" "C:\myfiles\notes.txt"
# 包含大写字母 'H'
findstr /c:"Hello, world" "C:\myfiles\notes.txt"

请注意,尽管 `notes.txt` 文件中有两行包含 ‘hello, world’ 字符串,但您只会得到一行字符串。

参数 /c 告诉 findstr 命令打印包含 ‘hello, world’ 字符串的行,不区分大小写。

Searching for the ‘hello, world’ literal string with the lowercase ‘h’

4. 最后,运行以下 findstr 命令来搜索 `notes.txt` 文件中包含 hello 模式的字符串,同时忽略 (/i) 字母大小写。

如果您已经知道要查找的字符串的实际大小写,区分大小写的搜索效果很好。但如果您希望看到与模式匹配的所有字符串行,而不考虑字母大小写,则参数 /i 就能解决问题。

findstr /i "hello" "C:\myfiles\notes.txt"
Searching strings while Ignoring the letter case

在文件和目录中查找指定的字符串

除了在文件中搜索特定字符串外,`findstr` 命令还允许您在文件、目录和子目录中搜索匹配的字符串。

假设您希望查找目录中包含特定单词的所有文件。如果是这样,让 /s 参数来处理繁重的工作。

运行以下命令在当前目录及其子目录中搜索 (/s) 所有包含 *.* 文件中的 system 字符串,忽略大小写 (-i)

请注意,此命令仅搜索包含整个单词 system 的文件,而不搜索作为更大单词的一部分的文件,比如 systematic 或 systemize。

findstr /s /i system *.*

下面的输出显示了一个文件名列表,每行一个文件,其中包含 ‘system’ 字符串的每个文件的名称。

Finding specified strings within files, directories, and subdirectories

使用 Select-String cmdlet 搜索字符串

到目前为止,您已经看到 findstr 命令在查找字符串方面效果非常出色,但不要忽视 Select-String cmdlet。这个 cmdlet 是 Windows 中的 grep 等效工具,允许您在文件和字符串中搜索特定的文本模式。

Select-String cmdlet 被设计用于高效搜索,让您能够快速搜索大量文本,并支持 正则表达式(regexes)。因此,此 cmdlet 允许您搜索比 findstr 更复杂的模式。

为了查看Select-String cmdlet的工作原理,请按照以下步骤进行:

1. 首先打开notes.txt文件,添加以下行,并保存更改。

添加这些行是为了演示Select-String cmdlet如何处理以下步骤中的大小写问题做的准备。

Apple
APPLE
ApplE

2. 接下来,运行以下命令在notes.txt文件中搜索字符串apple

Select-String -Pattern "apple" -Path "C:\myfiles\notes.txt"

下面,多行包含‘apple’字符串,但由于Select-String cmdlet是不区分大小写的,它们的大小写不同。但好的一点是,您可以轻松地查看和验证匹配的字符串,因为它们是突出显示的。

Searching for a string in a text file

? 也许您希望使用简单的字符串匹配而不是正则表达式匹配。如果是这样,请追加-SimpleMatch参数,如下所示,永远不必担心正则表达式语法和特殊字符。Select-String 'APPLE' "C:\\myfiles\\notes.txt" -SimpleMatch

3. 现在,运行以下命令在notes.txt文件中搜索APPLE,并启用大小写敏感性(-CaseSensitive)。-CaseSensitive参数对于搜索准确性非常有用。

Select-String -Pattern 'APPLE' -Path "C:\myfiles\notes.txt" -CaseSensitive

如您下面所看到的,找到的唯一匹配项具有您指定的确切大小写(APPLE)。

Searching for a string with case sensitivity enabled

4. 最后,运行以下命令,使用正则表达式在$PSHOME\en-US目录中的所有文本文件(*.txt)中搜索模式'\?'(问号)。正则表达式允许您搜索更复杂的模式。

Select-String -Path "$PSHOME\en-US\*.txt" -Pattern '\?’

如果文件内容中包含问号,该命令将在控制台中返回文件的完整路径,如下所示。

Searching for a string (a question mark) in files using regex

在Windows中使用ripgrep(rg)作为grep的替代品

rg是一个开源命令行实用程序,旨在快速使用正则表达式模式搜索文件。与其他命令行实用程序一样,rg具有许多选项和功能,可定制您的搜索。

但与findstrSelect-String cmdlet不同,rg不会默认安装在Windows操作系统中。

要在Windows中将rg用作grep的替代品:

1. 运行下面的scoop命令在系统上install ripgrepscoop install ripgrep

scoop install ripgrep
Installing ripgrep on your system

2. 接下来,运行以下rg命令以验证rg的安装版本。

rg --version

如下所示,您将看到安装的rg版本号。此时,您现在可以运行rg命令来搜索字符串。

Verifying rg is installed

3. 运行下面的rg命令在notes.txt文件中搜索字符串apple

rg apple C:\myfiles\notes.txt

输出显示notes.txt文件中包含字符串apple的任何行,如下所示。

请注意,输出类似于Select-String cmdlet的输出。但是,rg不是通过突出显示,而是通过更改匹配字符串和行号的颜色来进行快速区分。

Searching for the string ‘apple’ in a text file

4. 现在,运行以下带有正则表达式的命令以在notes.txt文件中搜索字符串。

以下的正则表达式使用了单词边界(`\b`),告诉 `rg` 查找包含以 ‘s’ 开头、以 ‘e’ 结尾的单词的字符串行(`s\w+e`)。

rg "\bs\w+e\b" "C:\myfiles\notes.txt"
Search for strings using regex

通过特定文件类型过滤搜索

也许你关心的是文件所在的目录,而不是文件的名称。在这种情况下,通过文件类型来过滤搜索可能是最好的选择。

当你只想搜索特定类型的文件时,将搜索结果过滤到特定文件类型可能是很有用的。或者当你想要排除某些类型的文件时。

要将搜索结果过滤到特定文件类型,使用 `–type` 选项就可以,具体操作如下:

1. 运行以下 `rg` 命令,在 `C:\\myfiles` 目录中的所有文本文件(`–type txt`)中搜索字符串 `apple`。

`–type` 选项需要一个文件类型作为参数,告诉 `rg` 命令只搜索与指定文件类型匹配的文件。

rg "apple" "C:\myfiles" --type txt

下面的输出显示了包含字符串 ‘apple’ 的行以及关联的文件名(notes.txt)。

Filtering the search to specific file types

2. 接下来,创建一个名为 `notes.xml` 的 XML 文件,并填充以下代码。这个 XML 文件只是为了演示通配符搜索的工作原理。

<?xml version="1.0" encoding="UTF-8"?>
<fruitBasket>
  <fruit id="1">
    <fruitName>Apple</fruitName>
  </fruit>     
</fruitBasket>

3. 现在,运行以下命令来在所有(*.)文件中搜索字符串apple。此命令仅搜索指定的txtxml文件(-g)。

rg "apple" "C:\myfiles" -g '*.{txt,xml}

默认情况下,rg区分大小写。因此,输出仅显示包含确切字符串“apple”及其关联文件的行。

Filtering searches by a broader range of file types

4. 最后,像在第三步中那样运行以下命令,以在所有具有txtxml扩展名的文件(*.)中搜索字符串apple。但是这次,追加-i选项,告诉rg忽略大小写。

rg "apple" "C:\myfiles" -g '*.{txt,xml}-i
Filtering searches by a broader range of file types ignoring letter cases

结论

通过本教程,您学会了在Windows中搜索字符串的许多grep等效方法,以文字形式和使用正则表达式。您已经通过一系列选项和参数解锁了这些grep等效方法的功能,以自定义搜索并过滤特定文件类型。

在这一点上,您应该对调试问题、识别问题和搜索大量文本文件有信心。

现在,为什么不将您的新技能付诸实践,通过练习正则表达式和定制您的搜索呢?

Source:
https://adamtheautomator.com/grep-equivalents-in-windows/