【问题标题】:Powershell Select-String output as CSV in 1 linePowershell Select-String 在 1 行中输出为 CSV
【发布时间】:2019-03-03 05:51:29
【问题描述】:

我正在尝试将 Select-String 的输出放入一行而不是多行,但我似乎无法理解。

这是我的输入字符串和一个非常简单的模式,用于在'=' 之后提取数据,

'trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | % { $_.Matches } | % { $_.Value.SubString(1) }

但不是为每个搜索的模式在单独的行中显示输出,

0FWEB8

030119

075257

671442647590

184

21

24229

9777A611236814D8

04

PT

TestB82PTResponseTags

00

0FWEB8

24

我正在尝试将输出显示为 CSV,在一行中表示类似这样的内容,

0FWEB8, 030119, 075257, 671442647590, 184, 21, 24229, 9777A611236814D8, 04, PT, TestB82PTResponseTags, 00, 0FWEB8, 24

尝试使用管道到Export-CSV,但即使这样也失败了。 应该是什么语法?我确信它很简单,但我似乎无法理解。

【问题讨论】:

    标签: regex powershell select-string export-csv


    【解决方案1】:

    你可以写得简单一点,如下。

    "REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }
    

    【讨论】:

    • 谢谢所有这些答案实际上是正确的,因为其他贡献者也提交了。我将您标记为正确答案,因为我能够轻松扩展您的文件输入答案...
    【解决方案2】:

    这是可以根据用例使用 -Join 的地方。

    about_Join | Microsoft Docs

    所以,你的意思是……

    Clear-Host
    ('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
    _SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | 
    select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | 
    % { $_.Matches } | 
    % { $_.Value.SubString(1) }) -join ', '
    
    # Results
    0FWEB8, 030119, 075257, 671442647590, 184, 21, 24229, 9777A611236814D8, 04, PT, TestB82PTResponseTags, 00, 0FWEB8, 24
    

    【讨论】:

      【解决方案3】:

      您可以将结果添加到ArrayList,然后使用-join 运算符获得所需的输出

      $values = New-Object System.Collections.ArrayList; 'trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS_SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | % { $_.Matches } | % { $values.Add($_.Value.SubString(1)) > $null }; $values -join ","
      

      输出:

      0FWEB8,030119,075257,671442647590,184,21,24229,9777A611236814D8,04,PT,TestB82PTResponseTags,00,0FWEB8,24
      

      【讨论】:

        【解决方案4】:

        我不认为我提供了一些原创的东西,但为什么不试试呢?

        @('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
        _SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]' |
        Select-String -Pattern '(?<==)[^,]+' -AllMatches | Select-Object -ExpandProperty Matches | ForEach-Object Value) -join ','
        

        [regex]::Matches('trailer data      [REFNO=0FWEB8,STRTDATE=030119,STRTTIME=075257,STRTINTIME=671442647590,IMPIND=184,CSP_MS_SRTIME_9580=21,CSP_MS
        _SRTIME_9210=24229,P4=9777A611236814D8,P7=04,CD=PT,S0=TestB82PTResponseTags,R0=00,R1=0FWEB8,CSP_MS_SRTIME_9560=24,]', '(?<==)[^,]+').ForEach({$_.Value}) -join ','
        

        输出:

        0FWEB8,030119,075257,671442647590,184,21,24229,9777A611236814D8,04,PT,TestB82PTResponseTags,00,0FWEB8,24
        

        【讨论】:

          猜你喜欢
          • 2017-12-16
          • 1970-01-01
          • 1970-01-01
          • 2020-01-19
          • 2013-08-13
          • 1970-01-01
          • 1970-01-01
          • 2023-03-23
          • 1970-01-01
          相关资源
          最近更新 更多