Powershell Select-字符串输出为 1 行 CSV
Powershell Select-String output as CSV in 1 line
我试图将 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
,但仍然失败了。
语法应该是什么?我确信它很简单,但我似乎无法理解。
这是可以根据用例使用 -Join 的地方。
那么,你的意思是……
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
您可以将结果添加到 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
你可以写的简单一点,如下。
"REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }
我不认为我提供了一些原创的东西,但为什么不试试呢?
@('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
- 运算语句:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-6#description;
ForEach
方法:
https://mcpmag.com/articles/2015/12/10/foreach-method-in-powershell.aspx;
[regex]
类型加速器:https://mcpmag.com/articles/2015/09/30/regex-groups-with-powershell.aspx;
Regex.Matches
方法:https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.matches?view=netframework-4.7.2.
我试图将 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
,但仍然失败了。
语法应该是什么?我确信它很简单,但我似乎无法理解。
这是可以根据用例使用 -Join 的地方。
那么,你的意思是……
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
您可以将结果添加到 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
你可以写的简单一点,如下。
"REFNO=0FWEB8,STRTDATE=030119" | select-string -Pattern '=[A-Za-z0-9]+' -AllMatches | foreach { $_.Matches.Value.SubString(1) -join ", " }
我不认为我提供了一些原创的东西,但为什么不试试呢?
@('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
- 运算语句:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/foreach-object?view=powershell-6#description;
ForEach
方法: https://mcpmag.com/articles/2015/12/10/foreach-method-in-powershell.aspx;[regex]
类型加速器:https://mcpmag.com/articles/2015/09/30/regex-groups-with-powershell.aspx;Regex.Matches
方法:https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.matches?view=netframework-4.7.2.