PowerShell:如何grep命令输出?


Answers:


74

我认为此解决方案更简单,更好,请直接使用功能findstr:

alias | findstr -i Write

您也可以使用grep单词作为别名:

new-alias grep findstr

2
在所有其他答案中,这是最直观,最容易记住的方法。
OV

4
1/2。只是为了澄清两件事,因为我有点困惑,试图了解该命令的作用。首先-i。如果显示带有findstr的帮助,findstr /?它将显示所有带有正斜杠的选项/。但是,它将接受以/OR-'. For example 开头的参数ipconfig / all在功能上与相同ipconfig -all。所以-i是一样的/i,自FINDSTR是一个古老的DOS程序,和老的DOS程序不关心的情况下,/i是idential来/I。所以这意味着这是一个案例敏感搜索。
叠煎饼

1
2/2。接下来让我感到困惑的是Write结尾。 alias是的别名Get-Alias,后者是PowerShell cmdlet。而Write实际上该字符串被搜索,而不是别名Write-Output,我还以为是因为颜色的格式化表示PowerShell命令的开始。我以为Write-Output可以代替findstr进行搜索。不是。因此,实际上发生的是,将的每行都通过Get-Alias管道传递到findstr,这将在管道的str中搜索搜索词“写”的不区分大小写的匹配项。
叠煎饼

应该是答案。
Polywhirl先生20年

46

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

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

或作为功能

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

alias | grep Alias

当您不处理管道中的内容时(例如您只是运行“ alias”时),shell会知道在每个对象上使用ToString()方法(或使用ETS信息中指定的输出格式)。


1
只是想补充一点,这适用于通用cli程序的输出。它模仿Linux ./foo | grep bar就像我想要的那样
Sint 2014年

这就是我想要的内容:Get-Command | 外串流| 选择字符串详细功能Disable-DeliveryOptimizationVerboseLogs 1.0.2.0 DeliveryOptimization功能Enable-DeliveryOptimizationVerboseLogs 1.0.2.0 DeliveryOptimization Cmdlet写详细信息
7.0.0.0

34

如果您真的想“格式化”格式化的输出(显示字符串),则可以使用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”显示的是Definition属性的内容,请考虑一下。您不仅可以复制一个属性的值,还可以通过该属性的内容过滤管道中的每个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*'}

5
您还可以使用findstrPowerShell将为您处理文本转换的位置,因为它不是cmdlet而是程序(出于完整性考虑;通常最好根据属性进行过滤,恕我直言:
Joey

仅供参考,根据Powershell 3,以下内容更为简洁:gal | Where Definition -match 'alias'
tkokasih 2014年

我觉得这是对OP内容的答复,但对标题却没有答复。如果我的命令是(例如)“ pip冻结”-输出就是文本。Roi的答案就是这个标题的意思。
丹尼·史泰普

13

有两个问题。如问题所示,选择字符串需要对输出字符串进行操作,可以从“输出字符串”中进行选择。另外,select-string不能对通过管道传递给它的字符串进行逐行操作。这是一个通用的解决方案

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

4
在Powershell 1.0中没有-split。您可以改为:(alias | out-string -stream)| 选择字符串写入
Mike

1
你们不是都完全错过了这一点吗?您不需要grep powershell的输出。
2011年

3
@ x0n好,在某些情况下,当我通过PS控制台快速搜索某些内容时,我不知道和/或不在乎它是否具有特定的属性。我觉得使用起来太麻烦了Get-Member,然后在where命令中使用正确的属性和表达式。并且grep在这一方面特别好。
OnesimusUnbound,2012年

4
不需要使用split。只需在-Streamon上使用参数Out-String,然后就可以直接通过管道传递给Select-String。
基思·希尔

5

提出的解决方案只是为了完成一些工作,例如:

Get-Alias -Definition Write*

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
}

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中匹配会矛盾什么,就像在字段中不匹配某个值

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.