根据文本文件PowerShell中的时间戳删除行
这里是PS新手,但我有一个日志文件,其中每个条目都写在单独的一行上,日期格式为:2013-04-29 08:55:09261 我正在尝试使用PowerShell删除所有超过30天的行。我一直在尝试用某种大于代码插入get-date格式的“yyyy-MM-dd-hh”输出,但现在我只是猜测。也一直在尝试批处理文件,但想坚持与PS,如果我可以 任何帮助都将不胜感激。试试以下方法:根据文本文件PowerShell中的时间戳删除行,powershell,batch-file,Powershell,Batch File,这里是PS新手,但我有一个日志文件,其中每个条目都写在单独的一行上,日期格式为:2013-04-29 08:55:09261 我正在尝试使用PowerShell删除所有超过30天的行。我一直在尝试用某种大于代码插入get-date格式的“yyyy-MM-dd-hh”输出,但现在我只是猜测。也一直在尝试批处理文件,但想坚持与PS,如果我可以 任何帮助都将不胜感激。试试以下方法: gc .\logfile.txt | %{if ([datetime][regex]::match($_, '^[0-9
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
- 在它前面加上
typecast运算符将其转换为datetime对象(以便将其与另一个datetime进行比较)[datetime]
返回一个表示当前日期和时间的DateTime对象,(获取日期)
从中减去30天,返回一个表示30天前的DateTime对象.AddDays(-30)
- 对于日志文件中的每一行,如果表示该行时间戳的日期时间大于表示30天前的日期时间(即,时间戳比30天前更近),则
块将打印该行,否则它将忽略该行if
- Adi Inbar的答案很好,但如果您希望避免使用正则表达式,这里有另一种方法:
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
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) }
假设文件包含以下内容:
2013-04-29 08:55:09,261 line1
2013-01-29 08:55:09,261 line2
2013-03-31 08:55:09,261 line3
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-03-31”)
我只是在coma上拆分行,取第一部分,在比较之前将其转换为日期
对于您的30天(获取日期).date
给出不含小时的日期(获取日期).date.adddays(-30)
给出今天之前30天的日期
get-content C:\temp\date.txt | where { [datetime]($_.split(','))[0] -ge (get-date).date.adddays(-30)}
您可以将结果导入一个新文件
|设置内容“C:\temp\newdate.txt”
,如果您显示实际代码,将非常有帮助。即使它不起作用,它也为人们提供了一个起点。该线程中的大多数代码都运行良好,并给出了期望的结果。唯一的主要区别是运行时间。我选择了这个,因为它运行得快了一点,但是任何遇到这个线程的人都应该有一些选择,所有这些都应该工作得很好。我将尝试对其他贡献发表评论,并给出我的结果。谢谢大家,非常有帮助。这一个删除了超过30天的线路,但由于某种原因,它在13:00之后直到第二天遗漏了任何内容。示例2013-04-29 13:07:42027至2013-04-29 23:57:10425将丢失。可能与24小时时钟格式有关??PS非常初级,所以不确定,但我想分享我的结果。@olirm-yep,我的错误,我的格式是指定12小时格式,而不是24小时固定格式。