Select-String输出提供整个对象,不响应过滤器

问题描述 投票:2回答:2

我在Unix / Linux上做过一些编程,但最近PowerShell在我的工作中更有用。然而,缺乏grep让我发疯。有人可以解释这种现象吗?

我试图让IOTA今天的价值恢复到我可以Write-Output的价值。

$webpage = Invoke-WebRequest -Uri https://coinmarketcap.com/currencies/iota/
$filtered = $webpage.ParsedHtml.body.innerText

这给了我所需的所有信息,但它需要更多的过滤。

$filtered | Select-String "IOTA"

这给了我$filtered中的所有信息,不知何故它无法选择该字符串。但是,如果我这样做,它的工作原理:

$filtered > filter.txt
Get-Content filter.txt | Select-String "IOTA"

我一直试图在网上搜索答案,我发现最接近的事情是它可能将$filtered作为对象处理,而不是字符串。如果我检查,它说它是一个字符串。

PS> $filtered.GetType()

IsPublic IsSerial Name                     BaseType
-------- -------- ----                     --------
True     True     String                   System.Object

这不是我第一次体验Select-String失败。我究竟做错了什么?

powershell grep select-string
2个回答
2
投票

$filtered是一个大字符串。如果将$filtered保存到文件中然后使用get-content读取它,则Get-Content cmdlet将返回文件的内容,作为由换行符分隔的字符串数组。

但是,由于html是结构化的,我建议你直接获取你感兴趣的元素,如:$webpage.parsedhtml.getElementById("quote_price").innerText

收益:

3.45 USD


1
投票

而不是$filtered | select-string "IOTA"

你可以使用($filtered | select-string ".*IOTA.*")

然后您可以选择匹配结果。在这种情况下使用正则表达式总是好的。但我建议你先用换行符拆分$过滤。这将消除混淆。然后继续。

所以这应该是一个更好的选择:

(($filtered).Split('`n') | select-string ".*IOTA.*")
© www.soinside.com 2019 - 2024. All rights reserved.