解鎖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 参数 "模式" "C:\\路径\\到\\文件1.txt" "C:\\路径\\到\\文件2.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.),另一行首字 ‘H’ 大寫 (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’ 字串的行,不論是小寫還是大寫 ‘H’。

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. 現在,執行以下命令以區分大小寫的方式(-CaseSensitive)在 notes.txt 檔案中搜尋 APPLE

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命令在系统上安装 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

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

请注意,输出与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/