使用Powershell从日志文件中拆分字段

时间:2017-10-03 10:53:33

标签: powershell

对Powershell来说相对较新,所以对于那些经验丰富的人来说,这可能是一个非常简单的问题。

我有一些日志文件(对于AWS S3存储桶),其中包含一些由空格分隔的文本字段(是的......)。日志每20秒左右在单独的文件中创建,因此一个月的日志超过100,000个文件。

我需要一次性下载它们,并将它们全部合并到一个文件中,以便将其复制到Amazon Redshift数据库中。这部分很好。我正在使用AWS命令行工具将本地文件夹与S3存储桶同步,使用包含和排除过滤器来获取我想要的日志,然后使用以下内容仅将包含“OBJECT”的条目写入组合文件中:

Get-ChildItem -recurse -include "*" | % { Get-Content $_ -ReadCount 0 | Select-String "OBJECT" | Add-Content logfiles\printlogs2017-09.txt }

然而,结果文件超过700MB,虽然它仍然可以工作,但我可以在Redshift中提取我想要的东西,实际上,我只需要三个字段,所以我不妨只写那些三个字段进入合并文件。

我认为,如果用空格分隔线条,这实际上就像将一个句子分成单词,并且只从中选择单词,所以试图通过一次将一行放入一个变量来做到这一点,然后使用foreach和split()将该行划分为一个字段数组,然后只输出我想要的字段,但是我尝试过的每个组合都有错误,因为我有参数或管道的结构(它应该这里要注意我还没有理解管道错误,或者它没有输出任何东西,因为数组在某种程度上是空的。

如何编辑上面的代码行以包含在空间中分割源代码的每一行的部分,然后只将结果数组的某些项(我认为是7,8和10)写入新文件, 被逗号隔开。最终,我追求的是(我知道这是错误的):

Get-ChildItem -recurse -include "2017-09-01-00*" | % { $lines = (Get-Content $_) | foreach { $fields = $_.split(" "); Set-Content ($fields[7] + ',' + $fields[8] + ',' + $fields[10]) } | Add-Content logfiles\printlogs2017-09-test.txt }

我最终想要的是:field7,field8,field10

1 个答案:

答案 0 :(得分:0)

这里有几个可能的选项,两者都可以生成一个CSV(这就是我想你想要的)。

选项1:从拆分中创建自定义对象,然后将其输出并将其输入Export-CSV

Get-ChildItem -recurse -include "2017-09-01-00*" | ForEach-Object { 
    Get-Content $_ | ForEach-Object { 
        $fields = $_.split(' ')
        [pscustomobject]@{
            Field7 = $fields[7]
            Field8 = $fields[8]
            Field10 = $fields[10]
        }
    }
} | Export-CSV logfiles\printlogs2017-09-test.csv -NoTypeInformation

选项2:Import-CSV与定义的标题行一起使用(如果日志文件已有标题行,则为可选项),并将分隔符指定为空格,使用{过滤器{1}}获取所需字段,然后通过Select-Object

导出
Export-CSV

显然,您可以自定义两者中的字段名称以适合您的数据。

我建议使用第二个选项,因为依赖于存在的数组项总是有点冒险。