2017-06-15 70 views
2

我需要構建一個腳本,它從各種日誌文件中讀取數據並使用powershell將數據放入csv中。輸出csv應該具有第一列作爲日誌文件的名稱,第二列應該包含日誌文件中的一些特定內容。第二列的內容不應該從同一文件出現兩次,這就是爲什麼第一列包含日誌文件的名稱。我設法提取兩種數據類型,但我的腳本只匹配使用正則表達式的第一個匹配,然後將結果放入csv中。PowerShell中的正則表達式僅匹配行的第一個匹配

我使用以下腳本:

$test = gc .\datalog.txt | Select-String -Pattern '"\w:\\\w+\\' -NotMatch | 
ForEach-Object { 
New-Object psobject -Property @{ 
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]') 
D_name = [regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])').Groups[1].value 
    } 
} 
$test | Select-Object D_no, D_name | Export-Csv abc.csv -NoTypeInformation 

D_name在我的劇本只匹配在哪裏我的預期操作是捕獲使用D_name正則表達式的所有條目行的第一場比賽。然而正則表達式工作正常,當我使用

Select-String -allmatches '^[^\:]*[^\.log:]|(?!\\)\w+\S+(?=\\)|(\w:\w+)[^"]').Matches.Value 

但這給了我的數據在一個單一的列D_no和D_name。 The sample data can be found here

回答

1

對於D_name您只提取一個匹配組 - Groups[1].value。所以這是預期的結果。要將所有匹配結果放入D_name,然後將其正確導出到CSV,您必須將它們組合成一個字符串。例如:

New-Object psobject -Property @{ 
D_no = [regex]::Matches($_, '^[^\:]*[^\.log:]').Value 
D_name = ([regex]::Matches($_, '((?!\\)\w+\S+(?=\\)|(\w:\w+)[^"])') | foreach {$_.Value}) -join ',' 
} 

注意,從用於D_no第一表達還得到一個MatchCollection,但僅含有1個元素。我建議從中獲取Value屬性。

+0

但是現在D_name中的值只出現在一行中,而不是每個單元格中的單個值 – n00b

+0

首先,在您的問題中,您說「第二列的內容」。這樣對嗎?其次,export-csv不支持任意數量的列。它檢查管道中的第一個對象,並僅包含所有其他對象的屬性。您可以嘗試通過導出匹配以逗號分隔的字符串來模擬export-csv(CSV格式,實際上) –