根据文本文件PowerShell中的时间戳删除行

时间:2013-04-29 19:13:03

标签: powershell batch-file

PS的新手,但是我有一个日志文件,其中每个条目都写在一个单独的行上,日期格式为:2013-04-29 08:55:09,261

我正在尝试使用PowerShell删除超过30天的所有行。我一直试图用一些比代码更大的东西来插入get-date -format“yyyy-MM-dd hh”输出,但此时我只是在猜测。还试图用批处理文件填写文件,但如果可以的话,我想坚持使用PS。

非常感谢任何帮助。

4 个答案:

答案 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对象
  • 对于日志文件中的每一行,如果表示该行的时间戳的DateTime大于30天前的DateTime(即,时间戳超过30天),则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) }