【问题标题】:How to fetch first column from given powershell array?如何从给定的powershell数组中获取第一列?
【发布时间】:2019-12-21 19:19:53
【问题描述】:

有一个命令执行并给我以下输出

Customer ID Client Name Computer Name Computer Brand
123        user1    127.0.0.1  lenovo
1          user2    127.0.0.2  apple
86         user3    127.0.0.1  dell
21         user4    127.0.0.4  apple

我想获取使用Computer Brandapple 的用户的Customer ID。输出应该如下,以便我可以对这些 ID 进行进一步的操作:

1
21

我尝试使用以下命令首先选择带有“apple”的用户:

$output | Select-String -pattern 'apple'

但是它只会打印带有“apple”的用户,而不是第一行,这让我很难进一步处理。

更新

我不知道以下是否有帮助。

PS> $output.GetType();

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您缺少 cmdlet Where-ObjectSelect-Object 的基本 PowerShell 概念

    #simulating $output
    $output = @"
    Customer ID,Client Name,Computer Name,Computer Brand
    123,user1,127.0.0.1,lenovo
    1,user2,127.0.0.2,apple
    86,user3,127.0.0.1,dell
    21,user4,127.0.0.4,apple
    "@ -split '\r?\n' | ConvertFrom-Csv
    
    $output | Where 'Computer Brand' -eq 'apple' | Select-Object 'Customer ID'
    

    样本输出:

    Customer ID
    -----------
    1
    21
    

    编辑以防万一您的输出不是对象而是纯文本,试试这个

    $output -replace '\s{2,}',',' | Select -skip 1 | 
      Convertfrom-Csv -Header 'Customer ID','Client Name','Computer Name','Computer Brand' | 
        Where 'Computer Brand' -eq 'apple' | Select-Object 'Customer ID'
    

    或者更简单

    ($output | sls '^(\d+).*apple').Matches|% {$_.groups[1].value}
    

    【讨论】:

    • 输出不是 CSV。正如我在问题中所显示的那样。
    • 猜猜#simulating data 的评论是什么意思?我将 $Data 替换为 $output 更容易理解。
    • 嗯奇怪,它没有给我任何输出。此外,您缺少关闭计算机品牌的单引号。另外,我不需要“客户 ID”
    • 第一个给了我不想要的带有“客户 ID”的输出。更简单的那个给了我想要的输出。现在,我需要对这些 ID 进行一些操作,例如 do some work on ID
    • 要省略第一个标题,请将Select更改为Select-Object -ExpandProperty 'Customer ID'
    【解决方案2】:

    如果我们假设 $output 是一个具有标题中列出的属性的对象,那么您可以执行以下操作来访问 Customer ID 值:

    $output.where({$_.'Computer Brand' -eq 'apple'}).'Customer ID'
    

    以下将列出具有目标Computer Brand 的对象的所有属性:

    $output.where({$_.'Computer Brand' -eq 'apple'})
    

    如果$output 已经是一个包含文本行的数组,您可以执行以下操作:

    $output = ($output | Select-Object -skip 1) -replace "\s+","," |
                 ConvertFrom-Csv -Header 'Computer ID','Client Name','Computer Name','Computer Brand'
    
    $output.where({$_.'Computer Brand' -eq 'apple'}).'Customer ID'
    

    【讨论】:

      【解决方案3】:

      这可能会派上用场:

      ((query user) -replace ">","") -replace "  {2,}","`t" |ConvertFrom-Csv -Delimiter "`t" |select -ExpandProperty USERNAME
      

      这会返回当前登录用户的列表。只有 USERNAME 列,没有标题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        • 2023-01-31
        • 2018-01-18
        • 2022-01-20
        • 2013-07-22
        相关资源
        最近更新 更多