在列之间添加分隔符并在左侧删除日志文件时间

时间:2016-07-15 16:57:04

标签: powershell

我有关于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; 07/15/2016:10:23:46; 139.18.40.21”的内容

3 个答案:

答案 0 :(得分: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 ';'
}

答案 1 :(得分: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操作以及替换搜索字符串中的其他.*:< / p>

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

答案 2 :(得分: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调整为:。)