正在文本文件中搜索字符串,但得到多个结果



我试图具体搜索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-Contentcmdlet(不带-Raw开关)通过管道逐个提供文件的行,也适用此方法,但出于性能原因,最好避免使用这种从文件提供输入的方法

相关内容

  • 没有找到相关文章

最新更新