Powershell-多行搜索,查找两个不同的字符串,return只匹配行

Powershell- Multi line search, find two different strings, return only matched lines

数据:

{
    "blah1":blah,
    "name":"hostname",
    "blah2":blah,
    "blah3":[{
      "blah4":blah,
      "blah5":blah,
    }],
    "blah6":blah,
    "blah7":blah,
    "osName":"OS Type",
    "blah8":blah,
    "blah9":blah,
  }

以上重复,我想搜索值 "name" 和 "osName." 以下是我所拥有的:

$Path = [io.file]::ReadAllText("$FilePath\list.txt")
$regex = '(?m)name":"(.*)".*\n.*osname":"(.*)"'
$list = $Path | Select-String $regex -AllMatches |Foreach { $_.Matches } | Foreach { $_.Groups } |Foreach { $_.Value }

我想要的输出是 return 具有特定 OS 类型的主机。所以,我的搜索之一是这样的:

$regex = '(?m)name":"(.*)".*\n.*osname":"Linux"'
    $list = $Path | Select-String $regex -AllMatches |Foreach { $_.Matches } | Foreach { $_.Groups[1] } |Foreach { $_.Value }

以上只会 return 所有 OsType 为 Linux 的主机。将来,我可能想要一个可用于搜索每个 "blah" 行且仅 return 匹配查询的搜索。我似乎无法弄清楚如何在多行文件中搜索超过 1 个字符串。

如有任何帮助,我们将不胜感激。谢谢大家

正则表达式很棒并且有其用途,但如果您有正确结构化的数据,则值得寻找处理该数据的方法。假设您的文件格式正确 JSON,您应该使用 Convert-FromJSON 将其转换为 PowerShell 对象。然后一个简单的 Select 应该 得到你需要的数据

$jsonObject = [io.file]::ReadAllText("$FilePath\list.txt") | ConvertFrom-Json
$jsonObject | Select name,osname

对于第一行你也可以做...

$jsonObject = Get-Content "$FilePath\list.txt" | Out-String | ConvertFrom-Json

或者如果你至少有 v3

$jsonObject = Get-Content "$FilePath\list.txt" -Raw | ConvertFrom-Json

运行一些示例数据

[{
  "id": 1,
  "name": "medwards0",
  "osName": "Windows"
}, {
  "id": 2,
  "name": "ecooper1",
  "osName": "Linux"
}, {
  "id": 3,
  "name": "jmccoy2",
  "osName": "Windows"
}]

我在控制台中得到以下结果

name      osName 
----      ------ 
medwards0 Windows
ecooper1  Linux  
jmccoy2   Windows

很棒的是,现在您可以使用 Where-Object 进行简单的过滤,以获得您正在寻找的数据

$jsonObject | Where-Object{$_.OsName -eq "Linux"}