我的数据文件a.alm
看起来像这样:
2018-05-19 00:26:00,551 [LUNSC1 ] D_TA204_GT1_DV_AL CFN LARM D_TA204_GT1_Reglerfel 2018-05-19 00:28:01,049 [LUNSC1 ] D_TA204_GT41_DV_AL CFN LARM D_TA204_GT41_Reglerfel 2018-05-19 00:28:01,049 [LUNSC1 ] D_TA204_GT31_DV_AL CFN LARM D_TA204_GT31_Reglerfel 2018-05-19 00:28:01,049 [LUNSC1 ] D_TA204_GT21_DV_AL CFN LARM D_TA204_GT21_Reglerfel 2018-05-19 00:35:19,627 [LUNSC1 ] U_TA364_GT11_LARM CFN LARM U_TA364_GT11_LARM 2018-05-19 00:39:56,135 [LUNSC1 ] U_TA364_GT11_LARM CFN LARM U_TA364_GT11_LARM 2018-05-19 00:47:12,612 [LUNSC1 ] U_KB6_GT11_DV_AL CFN LARM U-KB6-GT11 Avvikelselarm
我想将令牌5和8提取到另一个文件。在我的代码中,我使用split函数读取文件和循环的内容。
$alarmList = @(Get-Content -Path '.\A.ALM') | foreach {
$test = $_ -split ' '
Write-Host $test[6]" "$test[9]
} | Out-File -FilePath '.\Output.txt'
输出只给我第一个标记。我无法理解如何正确地将其打印到文件中。尝试用Write-Host
取代File-Output
没有任何好结果。
D_TA204_GT1_DV_AL D_TA204_GT41_DV_AL D_TA204_GT31_DV_AL D_TA204_GT21_DV_AL U_TA364_GT11_LARM U_TA364_GT11_LARM U_KB6_GT11_DV_AL U_FF415_GT46_L_AL U_KB6_GT11_DV_AL U_KB6_GT11_DV_AL U_KB6_GT11_DV_AL
我之前使用此脚本在命令行中管理了这个。
FOR /F "tokens=5" %%i in (A.alm) do echo %%i >> data.txt
但我想在PowerShell中进行管道处理,以便能够使用我已经拥有的脚本中的数据计算出现的数据。
(Select-String -Path '.\data.txt' -Pattern '[^ ]+' -AllMatches).Matches.Value |
Group-Object -NoElement |
ConvertTo-Csv -Delimiter "`t" -NoTypeInformation |
Out-File -FilePath '.\Statistics.csv'
这很好用,我理解其中的大部分内容。
$alarmList = @(Get-Content -Path '.\A.ALM') | foreach {
$token = $_ -split ' +'
[PSCustomObject]@{
date = $token[0]
time = $token[1]
H2 = $token[2]
H3 = $token[3]
H4 = $token[4]
H5 = $token[5]
H6 = $token[6]
H7 = $token[7]
H8 = $token[8]
}
}
$alarmList | Group H4 -NoElement | Select Name,Count | Out-Gridview
for /f
ccounts连续分隔符(默认为空格)只有一个
-split ' +'
只是为了演示-split
运算符的正则表达式结果:
(Get-Content -Path '.\A.ALM') | foreach {
$token = $_ -split ' +'
for ($i=0;$i -le 8;$i++){
"token[{0}]={1}" -f $i,$token[$i]
}
}
上面a.alm的输出短路:
token[0]=2018-05-19
token[1]=00:47:12,612
token[2]=[LUNSC1
token[3]=]
token[4]=U_KB6_GT11_DV_AL
token[5]=CFN
token[6]=LARM
token[7]=U-KB6-GT11
token[8]=Avvikelselarm
让$ alarmList包含所有这些列:
$alarmList = @(Get-Content -Path '.\A.ALM') | foreach {
$token = $_ -split ' +'
[PSCustomObject]@{
date = $token[0]
time = $token[1]
H2 = $token[2]
H3 = $token[3]
H4 = $token[4]
H5 = $token[5]
H6 = $token[6]
H7 = $token[7]
H8 = $token[8]
}
}
$alarmList | ft -auto
date time H2 H3 H4 H5 H6 H7 H8
---- ---- -- -- -- -- -- -- --
2018-05-19 00:26:00,551 [LUNSC1 ] D_TA204_GT1_DV_AL CFN LARM D_TA204_GT1_Reglerfel
2018-05-19 00:28:01,049 [LUNSC1 ] D_TA204_GT41_DV_AL CFN LARM D_TA204_GT41_Reglerfel
2018-05-19 00:28:01,049 [LUNSC1 ] D_TA204_GT31_DV_AL CFN LARM D_TA204_GT31_Reglerfel
2018-05-19 00:28:01,049 [LUNSC1 ] D_TA204_GT21_DV_AL CFN LARM D_TA204_GT21_Reglerfel
2018-05-19 00:35:19,627 [LUNSC1 ] U_TA364_GT11_LARM CFN LARM U_TA364_GT11_LARM
2018-05-19 00:39:56,135 [LUNSC1 ] U_TA364_GT11_LARM CFN LARM U_TA364_GT11_LARM
2018-05-19 00:47:12,612 [LUNSC1 ] U_KB6_GT11_DV_AL CFN LARM U-KB6-GT11 Avvikelselarm
当然,你可以进一步发挥它:
# $alarmList | Out-Gridview
# $alarmList | Export-csv '.\Output.csv' -NoTypeInformation
$alarmList | Group H4 -NoElement | Select Name,Count
Name Count
---- -----
D_TA204_GT1_DV_AL 1
D_TA204_GT41_DV_AL 1
D_TA204_GT31_DV_AL 1
D_TA204_GT21_DV_AL 1
U_TA364_GT11_LARM 2
U_KB6_GT11_DV_AL 1
您可以使用Select-Object
和-Index
参数选择要提取的行的索引,最后将其存储到Output.txt
文件中。
$file = Get-Content .\A.ALM
$file | Select-Object -Index 6,9 | Out-File -FilePath '.\Output.txt'