在文本文件中删除基于时间戳的行PowerShell
新手在PS这里,但我有一个日志文件,其中每个条目都写在这个日期格式的单独行上:2013-04-29 08:55:09,261在文本文件中删除基于时间戳的行PowerShell
我想使用PowerShell删除所有超过30天的行。我一直试图用某种比代码更好的方式插入get-date -format“yyyy-MM-dd hh”输出,但是现在我只是在猜测。也一直在尝试使用批处理文件进行文件处理,但是如果可以的话,我想要坚持使用PS。
任何帮助将不胜感激。
假设与内容的文件:
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"
+1我会这样做。 – 2013-04-30 09:42:55
此线程中的大部分代码运行良好,并提供了期望的结果。唯一的区别是运行时间。因为它跑得快一点,所以我选择了这款游戏,但任何碰到这个游戏的人都应该有一些选择,并且所有人都应该很好地工作。我会尽力评论其他的贡献,并给出我的结果。谢谢大家,非常有帮助。 – 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天),否则忽略该行
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) }
,如果你表现出你的实际代码这将有助于大大结果。即使它不起作用,它也给了人们一个起点。 – alroc 2013-04-29 20:12:24