在对象

时间:2017-05-20 10:35:12

标签: powershell parsing

我们有一些相当大的日志文件(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

1 个答案:

答案 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

我会尝试解释您的语法有什么问题:

  1. 要为管道中的每个元素处理ForEach-Object块,因此您必须将放入管道中

  2. }声明的结束hashtable应位于属性

  3. 之后
  4. Get-Content -Path需要一个文件路径并且您给它一个hashtable(您得到的错误是由于此原因)

  5. Get-Content不应该在ForEach-Object块中,因为您不想多次加载文件;它是你的管道的开始。