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'
輸出:
在這裡,我們可以理解 Select-String 方法有效,但由於我們傳遞了整個字串,因此沒有返回指定的方法。因此,讓我們嘗試通過使用換行符換行來傳遞單行,因為每個特定條目都在單行中給出
PS> test = test -split "`n"
PS> test | Select-String -Pattern 'Sara Peiris'
輸出:
在這裡我們可以看到它返回一行。接下來,我們應該研究一種可以返回多行的方法。
使用 PowerShell Select-String 查詢模式
在這裡,我們需要找到對所有行都有效的通用模式。所以如果我們看前面的例子,你可以看到所有的名字都被|
包圍了並且名稱用空格分隔。所以現在,讓我們使用正規表示式採用這種模式,並使用模式
引數傳送它。
Select-String
已使用正規表示式檢索每一行;在那之後,我將不得不分開所有的名字。我現在不需要每個地址。我們將使用 Select-String 返回的每個匹配物件的 Matches
屬性來完成此操作。
PS> test | Select-String -Pattern '\|\w+ \w+\|' | foreach {$_.Matches}
輸出:
現在你可以看到 Value 屬性具有我們需要的名稱,但它們仍被 |
包圍特點。那是因為正規表示式匹配包括|
名稱中的字元。
管道字元仍必須包含在過濾器中,但我們不希望它們作為匹配項返回。正規表示式組是一種方法。你要返回的結果用括號括起來,表示正規表示式組。在這種情況下,我將通過將表示名字和姓氏的正規表示式字串括起來再試一次。
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches}
輸出:
|
字元顯示在值中,但是我們可以看到該組已變為 {0,1}
,這意味著 Select-String 已識別該組。
我將在每個迴圈的 for
中重新插入引用以檢視該組。因為每個組屬性都是一個陣列,我們可以通過將第一個成員括在括號中然後使用 Value 屬性來引用它。
PS> test | Select-String -Pattern '\|(\w+ \w+)\|' | foreach {$_.Matches.Groups[1].Value}
輸出:
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.