在文本文件中删除基于时间戳的行PowerShell

问题描述:

新手在PS这里,但我有一个日志文件,其中每个条目都写在这个日期格式的单独行上:2013-04-29 08:55:09,261在文本文件中删除基于时间戳的行PowerShell

我想使用PowerShell删除所有超过30天的行。我一直试图用某种比代码更好的方式插入get-date -format“yyyy-MM-dd hh”输出,但是现在我只是在猜测。也一直在尝试使用批处理文件进行文件处理,但是如果可以的话,我想要坚持使用PS。

任何帮助将不胜感激。

+0

,如果你表现出你的实际代码这将有助于大大结果。即使它不起作用,它也给了人们一个起点。 – alroc 2013-04-29 20:12:24

假设与内容的文件:

2013-04-29 08:55:09,261 line1 
2013-01-29 08:55:09,261 line2 
2013-03-31 08:55:09,261 line3 

对我来说,你的日期是在国际标准日期表示法,所以你可以只使用:

$a = [datetime]"2013-04-29 08:55:09" 

然后$a将是一个日期,所以没有什么与文化做。

你可以像下面的所有行从一个日期(此处为“2013年3月31日”)

get-content "C:\temp\date.txt" | where { [datetime]($_.split(','))[0] -ge "2013-03-31"} 

我只是劈在昏迷行过滤,取第一部分,并将其转换比较之前的日期。

对于你的30天(get-date).date给日期不带小时和(get-date).date.adddays(-30)给出日期前30天。

get-content C:\temp\date.txt | where { [datetime]($_.split(','))[0] -ge (get-date).date.adddays(-30)} 

可以通过管道在一个新的文件| set-content "C:\temp\newdate.txt"

+0

+1我会这样做。 – 2013-04-30 09:42:55

+0

此线程中的大部分代码运行良好,并提供了期望的结果。唯一的区别是运行时间。因为它跑得快一点,所以我选择了这款游戏,但任何碰到这个游戏的人都应该有一些选择,并且所有人都应该很好地工作。我会尽力评论其他的贡献,并给出我的结果。谢谢大家,非常有帮助。 – olirm 2013-04-30 11:50:59

试试这个:这些组分

gc .\logfile.txt | %{if ([datetime][regex]::match($_, '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}').Value -gt (Get-Date).AddDays(-30)) {$_}} > purgedlogfile.txt 

细分和解释:

  • .\logfile.txt是路径到日志文件
  • ^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}是一个正则表达式,你的日志文件的时间戳格式相匹配在每行的开始处
  • [regex]::match($_, '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}').Value返回与正则e相匹配的时间戳XPRESSION
  • [datetime]类型转换操作者它前面将其转换为一个DateTime对象(为了比较它另一个日期时间)
  • (Get-Date)返回表示当前的日期和时间的日期时间对象,并.AddDays(-30)减去30天它,返回代表30天前
  • 对于在日志文件中的每一行DateTime对象,该if版画如果代表该行的时间戳的日期时间,比表示在30天前的日期时间越线(即时间戳比近期更30天),否则忽略该行
+0

Upvote的整洁的解释 – Benny 2014-07-17 04:18:17

阿迪因巴尔的回答是好,但如果你愿意,以避免正则表达式,这里的另一种方式:

Get-Content e:\pathto\logfile.txt | Where-Object { ((Get-Date) - (Get-Date $_.Substring(0,10))).Days -le 30} | Add-Content e:\pathto\NewLog.txt 

假设有以下内容的文件:

2013-04-29 08:55:09,261 line1 
2013-01-29 08:55:09,261 line2 
2013-03-31 08:55:09,261 line3 

你可以得到你想要的输出用:

$culture = [System.Globalization.CultureInfo]::InvariantCulture 
$format = 'yyyy-MM-dd HH:mm:ss,fff' 

Get-Content .\test.txt | ? { [datetime]::ParseExact(([string]$_).Substring(0,23), $format, $culture) -ge (Get-Date).AddDays(-30) } 
+0

这一个去掉了超过30天的线路权利,但由于某种原因,它失去了什么东西在13:00后,直到第二天。示例2013-04-29 13:07:42,027至2013-04-29 23:57:10,425将会丢失。可能与24小时制格式有关?在PS很初学者,所以不确定,但我想分享我的结果。 – olirm 2013-04-30 11:57:55

+0

@olirm - 是的,我的错误,我的格式是指定12小时格式,而不是24 - 固定。 – dugas 2013-04-30 14:40:55