PowerShell中的grep gci输出

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

我正在尝试确定是否设置了某些环境变量(针对postgres环境)。他们通常从PG开始。 (例如PGUSER,PGPASSWORD等)。以下命令输出它。 (前提是我之前设置过)。

gci env:* | sort name | more

为了消除滚动,我尝试了以下操作:

gci env:* | sort name | select-string "PG"

这不会返回任何内容。我在这里错了吗?

编辑:我现在有另一种选择:

gci env:* | sort name  | % { $var = $_.Name + ":" + $_.Value; Write-Output $var } | select-string "PG"

必须有更好的选择。

powershell grep
2个回答
0
投票

这是一个令人沮丧的问题,几天前我问了一个关于此问题的变体。其他人已经向Microsoft提出了更改此功能的请求(可能是姗姗来迟)。

Select-String仅处理字符串,而您在上面传递的内容不是字符串,因此它不返回任何内容。显然,您可能会认为,由于Select-String需要一个字符串,因此会将其隐式更改为字符串,但是没有。因此,接下来要考虑的是将其更改为字符串,但这会造成更多混乱。

gci env:* | sort name | out-string | select-string "PG"

所以现在您只得到everything返回。这里发生的是out-string作为单个字符串返回all行,因此,如果对“ PG”有任何点击,您将得到全部返回。

[您需要做的是使用out-string -stream,它通过换行符将字符串分割开,以便每行获得一个字符串,然后才有理输出。

gci env:* | sort name | out-string -stream | select-string "PG"

此处的更多信息:Using PowerShell sls (Select-String) vs grep vs findstr。链接到其中的github请求正在尝试更改功能,以便select-string在后台隐含一个out-string -stream,以便您的原始命令可以使用。


0
投票

您使用的是错误的思维方式。不要像一切都是字符串那样尝试使用PowerShell。那是类Unix的想法,它既可以工作,又可以用螺丝刀拧钉子。您需要切换到面向对象的思维,因为在PowerShell中,您有99%的时间使用对象。

通常,您只需要简单的操作就可以了:

Get-ChildItem Env:PG* | Sort-Object -Property Name

如果Get-ChildItem支持的glob不起作用,则您想将Where-Object-like运算符一起使用,这类似于Get-ChildItem可以执行的glob:

Get-ChildItem Env:* | Where-Object Name -like 'PG*' | Sort-Object -Property Name

或者您可以使用-match运算符,使您可以指定.Net正则表达式:

Get-ChildItem Env:* | Where-Object Name -match '^PG' | Sort-Object -Property Name

或者如果您确切知道要寻​​找的内容:

$Vars = 'PGUSER', 'PGPASSWORD'

Get-ChildItem Env:* | Where-Object Name -in $Vars | Sort-Object -Property Name

当然,请记住,PowerShell通常不区分大小写。如果需要区分大小写的运算符,则可以指定-clike-cmatch-cin等。

© www.soinside.com 2019 - 2024. All rights reserved.