gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:11:53 30 4
gpt4 key购买 nike

对于Powershell来说,它相对较新,所以对于任何对此有经验的人来说,这可能是一个非常简单的问题。

我有一些日志文件(用于AWS S3存储桶),其中包含一堆用空格分隔的文本字段(是的...)。每隔20秒左右在单独的文件中创建一次日志,因此一个月的日志值(value)超过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

最佳答案

这是为您提供的两个可能选项,它们都会为您生成一个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与已定义的标题行(如果日志文件已经具有标题行,则是可选的)一起使用,并且将分隔符指定为空格,请使用 Select-Object进行过滤以获取所需的字段,然后通过 Export-CSV导出:
Get-ChildItem -recurse -include "2017-09-01-00*" | ForEach-Object { 
Import-CSV $_ -Delimiter ' ' -Header 'Field0','Field1','Field2','Field3','Field4','Field5','Field6','Field7','Field8','Field9','Field10' | Select Field7,Field8,Field10
} | Export-CSV logfiles\printlogs2017-09-test.csv -NoTypeInformation

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

我建议第二种选择,因为依赖于存在的数组项总是有点风险。

关于powershell - 使用Powershell从日志文件中拆分字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46542899/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com