2011-11-01 101 views
0

我有一个从多服务器收集的预处理日志文件列表。他们在CSV格式和日志文件的内容的格式为:如何使用Powershell返回文件名和文件中的匹配文本

日期,时间,值1,值2,值3

我想有从文件名中的信息整合单个文件日志文件(具有服务器名称)以及日志文件中的Value1超过特定值以便进一步分析时的所有日期和时间。换句话说,我希望预期的输出为:

文件名20111/10/01,12:00:00.256,2345,210,0 文件名称12011/10/05,13:45:36.321 ,2666,209,0 文件名称5,2011/10/09,09:08:02.111,2100,180,0 文件名20,2011/10/15,17:09:33.256,3019,109,0 ...

我试图用Powershell +正则表达式来提取信息。但是,我只能得到包含我想要的值和文件名或仅包含日期,时间和值1的行。 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的,$ _。组[3] .value的}

是否有一种方式来获得我需要的结果呢?

感谢,

回答

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 

但是,如果您打算重新使用您的代码,您可能需要使用进口的CSV处理您的.csv文件,这应该提高可读性。

+0

,如果使用进口CSV正常,您可以设置日期部分的CSV作为DateTime类型,并将它们与-lt -gt等进行比较,这绝对是一种方式! –

+0

谢谢,它是我想要的。 –

2

如果日志文件是正确的CSV,并具有相同的头信息可以更简单地导入-CSV做到这一点:此外

Get-ChildItem c:\server\logs*.csv | Foreach {$f = $_.fullname; Import-Csv $_ | 
    Add-Member NoteProperty LogFilename $f -passthru } | 
    Export-Csv combinedlog.csv 
相关问题