PowerShell:如何grep命令输出?
在PowerShell我曾尝试:PowerShell:如何grep命令输出?
alias | select-string Alias
这个失败,即使Alias
,显然是在输出。我知道这是因为select-string在某个对象上运行,而不是实际的输出字符串。
可以做些什么呢?
有两个问题。在问题中,select-string需要对输出字符串进行操作,该字符串可以来自“out-string”。另外,select-string不会对传送给它的字符串进行逐行操作。这是一个通用的解决方案
(alias|out-string) -split "`n" | select-string Write
你的问题是别名发出的是一串AliasInfo对象,而不是一串 字符串。这就是我想要的。
alias | out-string -stream | select-string Alias
或作为功能
function grep {
$input | out-string -stream | select-string $args
}
alias | grep Alias
当你不处理的事情正在酝酿 (就像当你刚跑“别名”),外壳知道使用的ToString( )每个对象上的方法 (或使用ETS信息中指定的输出格式)。
只是想补充一点,这对通用cli程序的输出有效。它模仿Linux ./foo | grep吧就像我想要 – Sint 2014-10-08 12:12:55
如果你真的想“格式化”格式化输出(显示字符串),然后去迈克的方法。肯定有时候这会派上用场。但是,如果您想尝试拥抱PowerShell的对象管道特性,请尝试此操作。首先,检查出流下来的管道对象的属性:
PS> alias | Get-Member
TypeName: System.Management.Automation.AliasInfo
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
<snip>
*Definition* Property System.String Definition {get;}
<snip>
注意定义属性,它是你看到的,当你显示GET-别名(化名)的输出标题,例如:
PS> alias
CommandType Name *Definition*
----------- ---- ----------
Alias % ForEach-Object
<snip>
通常标题标题与属性名称相匹配,但并不总是如此。这就是使用Get-Member派上用场的地方。它显示你需要“脚本”反对。现在,如果你想要“grep”是定义属性的内容,那么考虑这一点。而不仅仅是grepping一个属性的值,可以改为此属性的内容进行筛选的pipepline每个AliasInfo对象,你可以使用正则表达式来做到这一点。例如:
PS> alias | Where-Object {$_.Definition -match 'alias'}
CommandType Name Definition
----------- ---- ----------
Alias epal Export-Alias
Alias gal Get-Alias
Alias ipal Import-Alias
Alias nal New-Alias
Alias sal Set-Alias
在这个例子中,我使用Where -Object cmdlet根据某些任意脚本过滤对象。在这种情况下,我通过与正则表达式“别名”匹配的Defintion属性进行过滤。只有那些对该过滤器返回true的对象才允许在管道中向下传播并进行格式化以在主机上显示。
顺便说一句,如果你输入这个,那么你可以使用Where-Object的两个别名之一 - 'Where'或'?'。例如:
PS> gal | ?{$_.Definition -match '-Item*'}
所提出的解决方案是只是许多工作的东西,可以这样做:
Get-Alias -Definition Write*
我觉得这个解决方案更容易,更好,直接使用该功能FINDSTR:
alias | findstr -i Write
您也可以使一个别名使用grep字:
new-alias grep findstr
这是所有其他答案中最直观易记的方法。 – 2017-10-31 09:25:44
对于更灵活和懒惰的解决方案,您可以匹配对象的所有属性。大多数情况下,这应该让你得到你想要的行为,而当它不行时你总是可以更具体。这里有一个基于这个原理的grep函数:
Function Select-ObjectPropertyValues {
param(
[Parameter(Mandatory=$true,Position=0)]
[String]
$Pattern,
[Parameter(ValueFromPipeline)]
$input)
$input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output
}
在Powershell 1.0中没有分割。您可以改为: (别名| out-string -stream)|选择字符串写 – Mike 2009-09-28 15:08:44
你不都完全忽略了这一点吗?你不需要grep powershell的输出。 – x0n 2011-09-06 03:01:55
@ x0n那么,有些情况下,当我通过PS控制台快速搜索某些东西时,我不知道和/或在意它是否属于特定属性。我发现使用'Get-Member'非常繁琐,然后在'where'命令中使用正确的属性和表达式。而'grep'在这个特别好。 – OnesimusUnbound 2012-02-08 12:32:54