PS的新手,但我有一个日志文件,其中每个条目都以这种日期格式写在单独的行上:2013-04-29 08:55:09,261
我正在尝试使用 PowerShell 删除所有超过 30 天的行。我一直在尝试使用某种大于代码的方式插入 get-date -format "yyyy-MM-dd hh" 输出,但此时我只是在猜测。也一直在尝试使用批处理文件的 forfiles,但如果可以的话,我想坚持使用 PS。
任何帮助将非常感激。
PS的新手,但我有一个日志文件,其中每个条目都以这种日期格式写在单独的行上:2013-04-29 08:55:09,261
我正在尝试使用 PowerShell 删除所有超过 30 天的行。我一直在尝试使用某种大于代码的方式插入 get-date -format "yyyy-MM-dd hh" 输出,但此时我只是在猜测。也一直在尝试使用批处理文件的 forfiles,但如果可以的话,我想坚持使用 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-03-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"
尝试这个:
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
返回正则表达式匹配的时间戳[datetime]
类型转换运算符会将其转换为 DateTime 对象(以便将其与另一个 DateTime 进行比较)(Get-Date)
返回一个表示当前日期和时间的 DateTime 对象,并.AddDays(-30)
从中减去 30 天,返回一个表示 30 天前的 DateTime 对象if
如果表示该行时间戳的 DateTime 大于表示 30 天前的 DateTime(即时间戳比 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
您可以通过以下方式获得所需的输出:
$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) }
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