2011-11-01 67 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 
相關問題