【问题标题】:Use Powershell to match and print specific column from output使用 Powershell 匹配并打印输出中的特定列
【发布时间】:2021-05-25 02:13:57
【问题描述】:

我想从命令的输出中获取特定列。有人可以建议最好的方法吗?

使用的命令是 - choco list -lo,输出为

Chocolatey v0.10.15
chocolatey 0.10.15
erlang 22.3
rabbitmq 3.8.11
3 packages installed.

从给定的输出中,唯一需要的值是3.8.11,它是rabbitmq的版本。

我已经尝试过了,但它不起作用 - choco list -lo | Select-String -Pattern "rabbit" | %{ $_.Split(' ')[1]; }

有人可以建议我们如何做到这一点吗?

提前致谢:)

【问题讨论】:

    标签: powershell split chocolatey select-string


    【解决方案1】:

    试试这个:

    choco list -lo | 
        Select-String -Pattern "rabbitmq (.+)" | 
        ForEach-Object { $_.Matches.Groups[1].Value }
    

    Select-String 的输出是一个MatchInfo 对象,所以需要查询它的成员才能得到匹配的值。

    我正在使用(.+) 组来启用版本号的提取,而无需进一步的字符串操作。然后通过$_.Matches.Groups[1].ValueForEach-Object 1 脚本块中读取组值。在这个表达式中,索引 1 指定了第一组(索引 0 将指定整个匹配项)。


    [1]ForEach-Object缩写为%

    【讨论】:

    • 答案是.+,但在解释中,你提到了.*,哪个更准确?我假设它是*.。虽然,我能够从他们两个那里获得所需的输出。
    • @Ismail .* 匹配任意字符零次或多次,.+ 匹配任意字符一次或多次。我认为后者更正确,因为我们希望该版本至少有一个字符。
    • 感谢您的解释
    【解决方案2】:

    没有逗号可以根据您发布的内容进行拆分。这是一个空间......

    我没有安装 choco,因为我没有它的用​​例。所以,一个伪列表是:

    选项1:

    Clear-Host
    $ChocoList = @'
    Chocolatey v0.10.15
    chocolatey 0.10.15
    erlang 22.3
    rabbitmq 3.8.11
    '@ -Split "`n"
    
    $ChocoList | 
    ForEach {
        (
            $PSItem | 
            Select-String -Pattern 'rabbitmq'
        ) -Split (' ')
    }
    # Results
    <#
    rabbitmq
    3.8.11
    #>
    

    选项2

    ([regex]::Matches($ChocoList,'rabbitmq.*').Value -split ' ')
    # Results
    <#
    rabbitmq
    3.8.11
    #>
    

    根据我对您的评论进行更新 - 选项 1:

    Clear-Host
    $ChocoList = @'
    Chocolatey v0.10.15
    chocolatey 0.10.15
    erlang 22.3
    rabbitmq 3.8.11
    '@ -Split "`n"
    
    ($ChocoList | 
    ForEach {
        (
            $PSItem | 
            Select-String -Pattern 'rabbitmq'
        ) -Split (' ')
    })[1]
    # Results
    <#
    3.8.11
    #>
    

    根据我对您的评论更新 - Option2

    ([regex]::Matches($ChocoList,'rabbitmq.*').Value -split ' ')[1]
    # Results
    <#
    3.8.11
    #>
    

    【讨论】:

    • 谢谢,@postanote,我的要求是只获得版本,别无其他。所以第一个解决方案对我有用。
    • 每个人都会得到版本。您只需按索引号选择它。意思是,只需将 [1] 添加到任何一个的偶数中。如更新。所有呈现的响应都在做同样的事情。
    猜你喜欢
    • 2022-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 2020-05-13
    • 1970-01-01
    • 2020-07-19
    相关资源
    最近更新 更多