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}
输出:
相关文章
获取 PowerShell 脚本的当前位置
发布时间:2024/02/29 浏览次数:67 分类:编程语言
-
本文将讨论如何在不同版本的 PowerShell 脚本环境中获取 PowerShell 脚本的当前位置。
在 Windows PowerShell 中终止脚本
发布时间:2024/02/29 浏览次数:91 分类:编程语言
-
本文将列举几种在 Windows PowerShell 中终止脚本的方法。本文将解释和定义所有几个命令,并引用示例脚本块来说明在何处使用它们。