PowerShell:如何grep命令输出?

时间:2009-09-28 03:04:50

标签: powershell

PowerShell我尝试过:

alias | select-string Alias

即使Alias显然在输出中,这也会失败。我知道这是因为select-string在某个对象上运行而不是实际的输出字符串。

可以做些什么呢?

8 个答案:

答案 0 :(得分:46)

我认为这个解决方案更简单,更好,直接使用函数findstr:

alias | findstr -i Write

您还可以使用别名来使用grep word:

new-alias grep findstr

答案 1 :(得分:33)

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

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

或作为一种功能

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

alias | grep Alias

当你不处理管道中的东西时 (就像你刚刚运行'alias'一样),shell知道使用ToString()方法 在每个对象上(或使用ETS信息中指定的输出格式)。

答案 2 :(得分:30)

如果你真的想要“格式化”格式化输出(显示字符串),那么请选择Mike的方法。绝对有时候这会派上用场。但是,如果您想尝试拥抱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>

请注意Definition属性,它是您在显示Get-Alias(别名)的输出时看到的标题,例如:

PS> alias

CommandType     Name           *Definition*
-----------     ----           ----------
Alias           %              ForEach-Object
<snip>

通常标题标题与属性名称匹配,但并非总是如此。这就是使用Get-Member派上用场的地方。它向您展示了“脚本”所需的内容。现在,如果您想要“grep”是定义属性内容,那么请考虑这一点。您可以使用此属性的内容来过滤管道中的每个AliasInfo对象,而不是仅仅对该属性的值进行grepping,您可以使用正则表达式来执行此操作,例如:

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根据某些任意脚本过滤对象。在这种情况下,我使用与正则表达式“alias”匹配的Defintion属性进行过滤。只允许那些为该过滤器返回true的对象沿管道传播并进行格式化以便在主机上显示。

顺便说一句,如果你输入这个,那么你可以使用Where-Object的两个别名之一 - 'Where'或'?'。例如:

PS> gal | ?{$_.Definition -match '-Item*'}

答案 3 :(得分:13)

有两个问题。在问题中,select-string需要对输出字符串进行操作,输出字符串可以来自“out-string”。此外,select-string不会对通过管道连接的字符串进行逐行操作。这是一个通用的解决方案

(alias|out-string) -split "`n" | select-string Write 

答案 4 :(得分:4)

建议的解决方案只是为了能够完成这样的工作:

Get-Alias -Definition Write*

答案 5 :(得分:0)

对于更灵活和懒惰的解决方案,您可以匹配对象的所有属性。大多数情况下,这应该可以帮助您获得所需的行为,而且当它没有时,您可以更加具体。这是一个基于这个原则工作的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
}

答案 6 :(得分:0)

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

然后在PS中匹配将导致字段与列中的某个值不匹配

答案 7 :(得分:0)

试试这个:

PS C:\> ipconfig /displaydns | Select-String -Pattern 'www.yahoo.com' -Context 0,7

>     www.yahoo.com
      ----------------------------------------
>     Record Name . . . . . : www.yahoo.com
      Record Type . . . . . : 5
      Time To Live  . . . . : 27
      Data Length . . . . . : 8
      Section . . . . . . . : Answer
      CNAME Record  . . . . : new-fp-shed.wg1.b.yahoo.com