PowerShell grep

Migel Hewage Nimesha 2023年1月30日 2022年5月16日
  1. Select-String cmdlet
  2. 使用 PowerShell 的典型 Grep 任務
  3. 使用 PowerShell Select-String 查詢模式
PowerShell grep

每當你需要掃描字串或整個文字檔案中的內容時,你會在哪裡開發 PowerShell 程式碼?如果你經常使用 Linux,那麼你應該熟悉流行的 grep 實用程式。grep 實用程式允許使用者使用各種引數查詢文字;但是,它在 Windows 中不可用。因此,在這種情況下,我們在 PowerShell 中有 Select-String cmdlet。

Select-String cmdlet

Select-String 預設檢查每行中的初始匹配,然後顯示屬於匹配行的行號、檔名和文字。Select-String 還可以通過使用位元組順序標記 (BOM) 確定編碼型別來處理多種檔案編碼,例如 Unicode 文字。如果缺少 BOM,Select-String 將假定它是一個 UTF8 檔案。

Select-String cmdlet 的一些用法解釋如下。

使用 PowerShell 的典型 Grep 任務

讓我們從一個例子開始。假設我們有一個包含名稱和地址的字串,而且該字串是非結構化的。我們要提取名稱。那麼我們將如何做到這一點將在下面解釋。

||Sara Peiris|| 37, De silva road, Panadura
 --||Tim Gangster||-- 345, Yolks street,KL
 ==|Suz Maker|== 44 Main, Cydney, CA

上面的文字分配給 users 變數。因此,嘗試將使用模式引數搜尋名稱。

test | Select-String -Pattern 'Sara Peiris'

輸出:

PowerShell grep 1

在這裡,我們可以理解 Select-String 方法有效,但由於我們傳遞了整個字串,因此沒有返回指定的方法。因此,讓我們嘗試通過使用換行符換行來傳遞單行,因為每個特定條目都在單行中給出

PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'

輸出:

PowerShell grep 2

在這裡我們可以看到它返回一行。接下來,我們應該研究一種可以返回多行的方法。

使用 PowerShell Select-String 查詢模式

在這裡,我們需要找到對所有行都有效的通用模式。所以如果我們看前面的例子,你可以看到所有的名字都被|包圍了並且名稱用空格分隔。所以現在,讓我們使用正規表示式採用這種模式,並使用模式引數傳送它。

Select-String 已使用正規表示式檢索每一行;在那之後,我將不得不分開所有的名字。我現在不需要每個地址。我們將使用 Select-String 返回的每個匹配物件的 Matches 屬性來完成此操作。

PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}

輸出:

PowerShell grep 3

現在你可以看到 Value 屬性具有我們需要的名稱,但它們仍被 | 包圍特點。那是因為正規表示式匹配包括|名稱中的字元。

管道字元仍必須包含在過濾器中,但我們不希望它們作為匹配項返回。正規表示式組是一種方法。你要返回的結果用括號括起來,表示正規表示式組。在這種情況下,我將通過將表示名字和姓氏的正規表示式字串括起來再試一次。

PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}

輸出:

PowerShell grep 4

|字元顯示在值中,但是我們可以看到該組已變為 {0,1},這意味著 Select-String 已識別該組。

我將在每個迴圈的 for 中重新插入引用以檢視該組。因為每個組屬性都是一個陣列,我們可以通過將第一個成員括在括號中然後使用 Value 屬性來引用它。

PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}

輸出:

PowerShell grep 5

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.