【问题标题】:How can I extract the latest rows from a log file based on latest date using Powershell如何使用 Powershell 根据最新日期从日志文件中提取最新行
【发布时间】:2012-08-30 23:07:07
【问题描述】:

我是一个相对较新的 Powershell 用户,并且有一个我认为很简单的问题。我花了一些时间寻找类似的场景,但令人惊讶的是没有找到任何类似的场景。我会发布我失败的尝试,但我什至无法接近!

我有一个包含重复数据的日志文件,我想为每个“唯一”条目提取最新事件。问题在于每个条目都是唯一的,因为它们具有单独的日期戳。 “唯一”标准在第 1 列。 示例:

AE0440,1,2,3,30/08/2012,12:00:01,XXX
AE0441,1,2,4,30/08/2012,12:02:01,XXX
AE0442,1,2,4,30/08/2012,12:03:01,XXX
AE0440,1,2,4,30/08/2012,12:04:01,YYY
AE0441,1,2,4,30/08/2012,12:06:01,XXX
AE0442,1,2,4,30/08/2012,12:08:01,XXX
AE0441,1,2,5,30/08/2012,12:10:01,ZZZ

因此我想要的输出是(顺序不相关):

AE0440,1,2,4,30/08/2012,12:04:01,YYY
AE0442,1,2,4,30/08/2012,12:08:01,XXX
AE0441,1,2,5,30/08/2012,12:10:01,ZZZ

如何获取这些数据/丢弃旧数据?

【问题讨论】:

    标签: date powershell logfiles logfile


    【解决方案1】:

    试试这个,对于第一次使用的用户来说,它可能看起来有点神秘。它读取文件的内容,按唯一值对行进行分组(现在我们有 3 个组),每个组通过解析日期时间值(再次通过拆分)进行排序,并返回第一个值。

    Get-Content .\log.txt | Group-Object { $_.Split(',')[0] } | ForEach-Object {    
        $_.Group | Sort-Object -Descending { [DateTime]::ParseExact(($_.Split(',')[-3,-2] -join ' '),'dd/MM/yyyy HH:mm:ss',$null) } | Select-Object -First 1    
    }
    
    AE0440,1,2,4,30/08/2012,12:04:01,YYY
    AE0441,1,2,5,30/08/2012,12:10:01,ZZZ
    AE0442,1,2,4,30/08/2012,12:08:01,XXX
    

    【讨论】:

    • 感谢两者,我想我对 [DateTime]::ParseExact 缺乏了解让我失望了。我标记了 Shay 的答案,因为我真的不想添加标题,但两者都有助于跳转到解决方案。
    • 很高兴您解决了问题。请注意,当使用 Import-Csv-Header 参数时,您不会将标题添加到文件中。当文件 没有 有标题时,您需要使用该参数,以便 cmdlet 知道如何命名每一列。否则,它假定文件的第一行包含列名。
    【解决方案2】:

    假设您的数据与您的示例完全相同:

    # you can give more meaningful names to the columns if you want. just make sure the number of columns matches
    $data = import-csv .\data.txt -Header Col1,Col2,Col3,Col4,Col5,Col6,Col7
    
    # sort all data by the timestamp, then group by the label in column 1
    $grouped = $data | sort {[DateTime]::ParseExact("$($_.Col6) $($_.Col5)", 'HH:mm:ss dd/MM/yyyy', $Null)} -Desc | group Col1
    
    # read off the first element of each group (element with latest timestamp)
    $grouped |%{ $_.Group[0] }
    

    这还假设您的时间戳是 24 小时制的。即您的所有样本数据都接近中午 12 点,而不是午夜 12 点。午夜后一秒需要指定为 '00:00:01'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2020-08-12
      • 1970-01-01
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多