数据:
{
"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个字符串。
任何帮助将不胜感激。谢谢你的支持
答案 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"}