我试图具体搜索172.21.134.16,但发现了不需要的其他行(即172.21.134.161、162、163等)。我只是希望结果为172.21.134.16。
PS C:ScriptsPing> Get-ChildItem -path c:scriptspinghostnames.txt -Recurse | select-string -Pattern '172.21.134.16'
hostnames.txt:119:SMFTBCR0601 172.21.134.16
hostnames.txt:120:SMFTBGT1101 172.21.134.161
hostnames.txt:121:SMFTBGT1102 172.21.134.162
hostnames.txt:122:SMFTBGT1103 172.21.134.163
hostnames.txt:123:SMFTBGT1201 172.21.134.165
hostnames.txt:124:SMFTBGT1202 172.21.134.166
hostnames.txt:125:SMFTBGT1203 172.21.134.167
PS C:ScriptsPing> Get-ChildItem -path c:scriptspinghostnames.txt -Recurse | select-string -Pattern '172.21.134.16'
预期:
SMFTBCR0601 172.21.134.16
Santiago Squarzon在评论-Pattern 'b172.21.134.16b'
中提供了解决方案,但让我提供背景信息:
-
通常,
Select-String
在文件的各个行上查找-Pattern
参数作为子字符串通过管道的System.IO.FileInfo
实例,例如通过Get-ChildItem
-这同样适用于通过Select-String
自己的-Path
和-LiteralPath
参数的目标文件[1]- 因此,即使使用
-SimpleMatch
(见下文)逐字逐句地搜索172.21.134.16
以查找,它也会始终匹配包含… 172.21.134.161 …
或… 0172.21.134.161 …
的行
- 因此,即使使用
-
默认情况下,
Select-String
将其-Pattern
参数解释为正则表达式。- 如果要按逐字(文字)子字符串进行搜索,请添加
-SimpleMatch
开关
- 如果要按逐字(文字)子字符串进行搜索,请添加
-
如果您希望有条件地匹配子字符串,取决于它们周围的字符,则使用正则表达式(即而不是使用
-SimpleMatch
)是必须的,例如在本例中:-
在正则表达式中,
b
是一个单词边界断言,它确保后面或前面的字符/子表达式只有在前一个/后一个字符不是词字符(字母、数字或_
(下划线))时才匹配 -
但是,如果要以这种方式约束的子字符串在正则表达式的上下文中逐字处理,则需要使用
(尤其是
.
)来转义其中的任何正则表达式元字符(否则表示任何字符)。为此,您有两个选项: -
在literal模式字符串中,您可以单独地
-转义所有regex元字符,这将产生Santiago的解决方案:
-Pattern 'b172.21.134.16b'
-
如果您不提前知道逐字逐句的子字符串,或者不想考虑需要转义哪些元字符,请使用
[regex]::Escape()
.NET方法:-Pattern ('b' + [regex]::Escape('172.21.134.16') + 'b')
-
[1]如果使用Get-Content
cmdlet(不带-Raw
开关)通过管道逐个提供文件的行,也适用此方法,但出于性能原因,最好避免使用这种从文件提供输入的方法