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 
+3

在Powershell 1.0中没有分割。您可以改为: (别名| out-string -stream)|选择字符串写 – Mike 2009-09-28 15:08:44

+1

你不都完全忽略了这一点吗?你不需要grep powershell的输出。 – x0n 2011-09-06 03:01:55

+2

@ x0n那么,有些情况下,当我通过PS控制台快速搜索某些东西时,我不知道和/或在意它是否属于特定属性。我发现使用'Get-Member'非常繁琐,然后在'where'命令中使用正确的属性和表达式。而'grep'在这个特别好。 – OnesimusUnbound 2012-02-08 12:32:54

你的问题是别名发出的是一串AliasInfo对象,而不是一串 字符串。这就是我想要的。

alias | out-string -stream | select-string Alias 

或作为功能

function grep { 
    $input | out-string -stream | select-string $args 
} 

alias | grep Alias 

当你不处理的事情正在酝酿 (就像当你刚跑“别名”),外壳知道使用的ToString( )每个对象上的方法 (或使用ETS信息中指定的输出格式)。

+0

只是想补充一点,这对通用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*'} 
+4

您也可以使用'findstr'这里的PowerShell将处理转换为文本的你,因为它不是一个小命令而是一个程序(刚出来完整性;一般总是最好根据性质进行过滤,恕我直言:-)) – Joey 2009-09-28 21:03:37

+0

FYI ,按照Powershell 3,以下更简洁: 'gal |哪里定义 - 匹配“别名” – tkokasih 2014-04-13 10:33:45

+0

我觉得这个OP内容的答案,但不是标题。如果我的命令是(例如)“点冻结” - 输出只是文本。 Roi的回答是这似乎意味着什么。 – 2017-08-13 15:36:31

所提出的解决方案是只是许多工作的东西,可以这样做:

Get-Alias -Definition Write* 

我觉得这个解决方案更容易,更好,直接使用该功能FINDSTR:

alias | findstr -i Write 

您也可以使一个别名使用grep字:

new-alias grep findstr 
+0

这是所有其他答案中最直观易记的方法。 – 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 
}