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"}
数据:
{
"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"}