Date 如何使用Powershell根据最新日期从日志文件中提取最新的行

Date 如何使用Powershell根据最新日期从日志文件中提取最新的行,date,powershell,logfiles,logfile,Date,Powershell,Logfiles,Logfile,我是一个相对较新的Powershell用户,有一个我认为很简单的问题。我花了一点时间寻找类似的场景,但令人惊讶的是没有发现任何类似的场景。我会张贴我失败的尝试,但我甚至不能接近 我有一个包含重复数据的日志文件,我想提取每个“唯一”条目的最新事件。问题在于每个条目都是唯一的,因为每个条目都有单独的日期戳。“唯一”标准见第1列。 例如: 因此,我想要的输出是(订单不相关): 如何获取此数据/丢弃旧数据?试试这个,对于第一次使用此数据的用户来说,它可能看起来有点神秘。它读取文件的内容,按唯一值对行进行

我是一个相对较新的Powershell用户,有一个我认为很简单的问题。我花了一点时间寻找类似的场景,但令人惊讶的是没有发现任何类似的场景。我会张贴我失败的尝试,但我甚至不能接近

我有一个包含重复数据的日志文件,我想提取每个“唯一”条目的最新事件。问题在于每个条目都是唯一的,因为每个条目都有单独的日期戳。“唯一”标准见第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

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

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

# 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小时时钟上。i、 你所有的样本数据都接近中午12点,而不是午夜12点。午夜后一秒需要指定为“00:00:01”

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

# 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小时时钟上。i、 你所有的样本数据都接近中午12点,而不是午夜12点。午夜后的一秒钟需要指定为“00:00:01”

多亏了这两个词,我想我对[DateTime]::ParseExact的了解不够,这让我很失望。我标记了Shay的答案,因为我不想添加标题,但这两个标题在跳转到解决方案时都很有用。很高兴你解决了你的问题。请注意,在使用
导入Csv
-Header
参数时,您没有向文件添加头。当文件没有标题时,需要使用该参数,以便cmdlet知道每个列的名称。否则它假定文件的第一行包含列名。多亏了这两个列名,我想我对[DateTime]::ParseExact缺乏了解。我标记了Shay的答案,因为我不想添加标题,但这两个标题在跳转到解决方案时都很有用。很高兴你解决了你的问题。请注意,在使用
导入Csv
-Header
参数时,您没有向文件添加头。当文件没有标题时,需要使用该参数,以便cmdlet知道每个列的名称。否则,它假定文件的第一行包含列名。