PS的新手,但是我有一个日志文件,其中每个条目都写在一个单独的行上,日期格式为:2013-04-29 08:55:09,261
我正在尝试使用PowerShell删除超过30天的所有行。我一直试图用一些比代码更大的东西来插入get-date -format“yyyy-MM-dd hh”输出,但此时我只是在猜测。还试图用批处理文件填写文件,但如果可以的话,我想坚持使用PS。
非常感谢任何帮助。
答案 0 :(得分:2)
试试这个:
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
块将打印该行;否则它忽略了行答案 1 :(得分:2)
假设文件包含以下内容:
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"
答案 2 :(得分:1)
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
答案 3 :(得分:1)
假设文件包含以下内容:
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) }