2016-07-15 21 views
1

我有關於PowerShell和解析/格式化數據的問題。在列之間添加分隔符並刪除左側的日誌文件時間

我現在有看起來像這樣的數據:

10:23:46 Starting execution of script 
10:23:46 Default user will be svc_consumption 
10:23:46 Checking Data Domain Available Space 
10:23:48 Model number: DD890 - 07/15/2016 10:23:46 - 139.18.40.21 - 
10:23:50 Model number: DD890 - 07/15/2016 10:23:46 - 103.153.18.28 - 
10:23:52 Model number: DD890 - 07/15/2016 10:23:46 - 12.19.41.75 - 

10:24:02 Model number: DD880 - 07/15/2016 10:23:46 - 103.6.28.71 - 
10:24:04 Model number: DD890 - 07/15/2016 10:23:46 - 10.116.83.12 - 
10:24:05 Model number: DD4500 - 07/15/2016 10:23:46 - 10.18.31.86 - 
10:24:06 Model number: DD4500 - 07/15/2016 10:23:46 - 10.18.23.10 - 

我想知道大家的想法是如何通過刪除日誌的時間和投入分號作爲分隔符來分析這些數據。
我試了幾次,但我所有的嘗試都太複雜了。 任何想法?

感謝任何幫助過的人!

編輯:希望得到類似「DD890; 2016年7月15日:10:23:46; 139.18.40.21」

+2

「以分號作爲分隔符「 - 在哪裏?你想劃定什麼? :-) –

+1

請提交你想要的分隔線樣本。 – markg

+0

這可能只是矯枉過正。比收益更多的工作。如果你需要以這種方式導出,那將是一個不同的故事。 –

回答

2

我將使用正則表達式替換這樣的:

$inputFile = 'C:\path\to\your.log' 
$outputFile = 

$re = '([A-Z]{2}\d+) - (\d{2}/\d{2}/\d{4}) (\d{2}:\d{2}:\d{2}) - ' + 
     '(\d+\.\d+\.\d+\.\d+) -$' 

(Get-Content 'C:\input.txt') -match $re -replace ".*$re", '$1;$2:$3;$4' | 
    Set-Content 'C:\output.txt' 

如果你想要的內容的其餘部分留在原位,只是改變DD890 - 07/15/2016 10:23:46 - 139.18.40.21 -子的格式取出-match操作和查找替換字符串附加.*

(Get-Content 'C:\input.txt') -replace $re, '$1;$2:$3;$4' | 
    Set-Content 'C:\output.txt' 
+0

感謝這個正則表達式工作得很好。 –

1

我攤開許多變量賦值的,有希望給你一些每個單獨的一步知名度,而不是更短的代碼,這將需要過多的解釋,不熟悉的人的過程:

$outputFile = "c:\test\output.txt" 
$inputFile = "c:\test\input.txt" 
if (Test-Path $outputFile) 
    {Remove-Item $outputFile} 
$fileData = Get-Content $inputFile 
foreach ($line in $fileData) 
{ 
    if ($line -like "*Model number*") 
    { 
     $newline = $line -replace ".*Model number: ", "" 
     $newline = $newline -replace " - ", ";" 
     $newline = $newline.TrimEnd(" -") 
     $newline = $newline -replace " ", ";" 
     Add-Content $outputFile $newline 
    } 
} 

你的樣本數據,如問題提供,看起來像這樣在output.txt算賬:

DD890;07/15/2016;10:23:46;139.18.40.21 
DD890;07/15/2016;10:23:46;103.153.18.28 
DD890;07/15/2016;10:23:46;12.19.41.75 
DD880;07/15/2016;10:23:46;103.6.28.71 
DD890;07/15/2016;10:23:46;10.116.83.12 
DD4500;07/15/2016;10:23:46;10.18.31.86 
DD4500;07/15/2016;10:23:46;10.18.23.10 

注意:我假設你有MM/DD/YYYY和HH之間的錯字:MM:SS數據,你有一個:,但我認爲你的意思;如果不是,調整非常最後-replace:代替)

2

假設你只需要包含行「型號」,用Where-Object對那些過濾膜,然後拆分每個字符串,並加入他們重新走到一起:

Get-Content .\file.txt|Where-Object {$_ -like '*Model number*'} |ForEach-Object { 
    # Remote the timestamp and "Model number: " string 
    # then split by "-" and finally Trim() whitespace off each resulting substring 
    $parts = $_ -replace '^[\d\s:]+Model number: ','').Split('-',[System.StringSplitOptions]::RemoveEmptyEntries)|%{$_.Trim()} 

    # concatenate the parts back together with -join 
    $parts -join ';' 
} 
相關問題