如何使用Powershell基于最新日期从日志文件中提取最新行

时间:2012-08-30 14:27:14

标签: date powershell logfiles logfile

我是一个相对较新的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

如何获取此数据/丢弃旧数据?

2 个答案:

答案 0 :(得分:3)

试试这个,对于初次使用者来说可能看起来有点神秘。它读取文件的内容,按唯一值对行进行分组(现在我们有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

答案 1 :(得分:1)

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

# 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'