Powershell-多行搜索,找到两个不同的字符串,只返回匹配的行

时间:2015-12-31 15:25:38

标签: regex powershell multiline

数据:

{
    "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 }

我想要的输出是返回具有特定操作系统类型的主机。所以,我的一个搜索是这样的:

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

以上只会返回所有具有Linux的OsType的主机。在将来,我可能希望有一个搜索可用于搜索每个“blah”行并返回仅匹配的查询。我似乎无法弄清楚如何在多行文件中搜索超过1个字符串。

任何帮助将不胜感激。谢谢你的支持

1 个答案:

答案 0 :(得分: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"}