我有一个从mutliple服务器收集的预处理日志文件列表。它们是CSV格式,日志文件的内容格式为:
日期,时间,值1,值,值3
我希望将一个文件与日志文件的文件名(具有服务器名称)中的信息以及Value1超过日志文件中的特定值的所有日期和时间进行整合以进行进一步分析。换句话说,我希望预期的输出为:
Filename1,2011 / 10 / 01,12:00:00.256,2345,210,0 Filename1,2011 / 10 / 05,13:45:36.321,2666,209,0 Filename5,2011 / 10 / 09,09:08:02.111,2100,180,0 Filename20,2011 / 10 / 15,17:09:33.256,3019,109,0 ...
我尝试使用Powershell +正则表达式来提取信息。但是,我只能得到包含我想要的值和文件名的行,或者只包含Date,time和Value1。 PowerShell脚本是:
select-string -path“C:\ Server \ Logs * .csv”-pattern“([0-9] {4} / [0-9] {1,2} / [0-9] {1 ,2}),([0-9] {2}:[0-9] {2}:[0-9] {2})[0-9] {3},([2-9] [ 0-9] {3})“| select-object -property filename,linenumber,line | export-csv -path highload2.csv
select-string -path“C:\ Server \ Logs * .csv”-pattern“([0-9] {4} / [0-9] {1,2} / [0-9] {1 ,2}),([0-9] {2}:[0-9] {2}:[0-9] {2})[0-9] {3},([2-9] [ 0-9] {3})“| select-object -expand匹配| Foreach {$ .Groups [1] .Value,$ .Groups [2] .Value,$ _。Groups [3] .Value}
有没有办法得到我需要的结果?
谢谢,
答案 0 :(得分:2)
如果日志文件是正确的CSV并且具有相同的标题信息,则可以使用Import-Csv更简单地执行此操作:
Get-ChildItem c:\server\logs*.csv | Foreach {$f = $_.fullname; Import-Csv $_ |
Add-Member NoteProperty LogFilename $f -passthru } |
Export-Csv combinedlog.csv
答案 1 :(得分:0)
与您的单行相似:
select-string -path "C:\Server\Logs*.csv" -pattern "([0-9]{4}/[0-9]{1,2}/[0-9]{1,2}),([0-9]{2}:[0-9]{2}:[0-9]{2}).[0-9]{3},([2-9][0-9]{3}),([0-9]*),([0-9]*)" | select-object -property filename, @{N="Date";E={$_.matches | %{$_.groups[1].value}}}, @{N="Time";E={$_.matches | %{$_.groups[2].value}}}, @{N="Value1";E={$_.matches | %{$_.groups[3].value}}}, @{N="Value2";E={$_.matches | %{$_.groups[4].value}}}, @{N="Value3";E={$_.matches | %{$_.groups[5].value}}} | export-csv -path highload2.csv
但是,如果您打算重新使用代码,则可能需要使用import-csv处理.csv文件,这样可以提高可读性。