我们有一些相当大的日志文件(3-8Gb),用空格分隔,有64个标题。我需要搜索这些并提取搜索词,但只需要来自64个头中的5个的数据。
我是Tobias Weltner遇到的this presentation。在查看之后,我有一些代码片段但似乎陷入了实际获得任何结果。
基本上我需要从更大的文件中搜索5个标题。我到目前为止的代码是:
$Search = "J89HD"
$logfile = "C:\Logs\CP8945KGT.log"
ForEach-Object {
$line = $_
$infos = $line -split " "
$hashtable = [Ordered]@{}
$hashtable.date = $infos[0]
$hashtable.time = $infos[1]
$hashtable.Index = $infos[2]
$hashtable.source = $infos[3]
$hashtable.destination = $infos[-1]
New-Object -TypeName psobject -Property $hashtable
Get-Content -Path $hashtable |
Where-Object { $_ -match "$Search" } |
Select-Object -Last 20 |
Out-GridView
}
我得到的错误信息是:
Get-Content: Cannot find path 'C:\System.Collections.Specialized.OrderedDictionary' because it does not exist.
At C:\scripts\testing01.ps1:17 char:1
+ Get-Content -Path $hashtable | Where-Object {$_ -match "$Search"} | ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\System.Colle...deredDictionary:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
答案 0 :(得分:1)
以下是基于您要执行的操作和代码段的代码段。这是未经测试的,因为我们没有要测试的样本输入数据。
$Search = "J89HD"
$logfile = "C:\Logs\CP8945KGT.log"
#load file
Get-Content -Path $logfile |
#apply search filter on each line
Where-Object { $_ -match $Search } |
#keep only last 20 lines
Select-Object -Last 20 |
#for each line
ForEach-Object {
#store the line in a variable
$line = $_
#split the line on spaces to get an array
$infos = $line -split " "
#build a hashtable with properties holding specific cells of the array
$hashtable = [Ordered]@{
date = $infos[0]
time = $infos[1]
Index = $infos[2]
source = $infos[3]
destination = $infos[-1]
}
#build a custom object with the properties in the hastable
New-Object -TypeName psobject -Property $hashtable
#display the objects in a window
} | Out-GridView
我会尝试解释您的语法有什么问题:
要为管道中的每个元素处理ForEach-Object
块,因此您必须将放入管道中
}
声明的结束hashtable
应位于属性
Get-Content -Path
需要一个文件路径并且您给它一个hashtable
(您得到的错误是由于此原因)
Get-Content
不应该在ForEach-Object
块中,因为您不想多次加载文件;它是你的管道的开始。