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.