簡體   English   中英

根據文本文件PowerShell中的時間戳刪除行

[英]Delete lines based on time stamp in text file PowerShell

PS的新手在這里,但是我有一個日志文件,其中每個條目都用以下日期格式寫在單獨的行上:2013-04-29 08:55:09,261

我正在嘗試使用PowerShell刪除所有30天以上的行。 我一直在嘗試用某種大於代碼的形式插入get-date -format“ yyyy-MM-dd hh”輸出,但是在這一點上我只是在猜測。 也一直在嘗試使用批處理文件的forfiles,但如果可以的話,我想堅持使用PS。

任何幫助將非常感激。

嘗試這個:

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] typecast運算符之前將其轉換為DateTime對象(以便將其與另一個DateTime比較)
  • (Get-Date)返回代表當前日期和時間的DateTime對象, .AddDays(-30)從中減去30天,以返回代表30天之前的DateTime對象
  • 對於日志文件中的每一行, if代表該行時間戳的DateTime大於代表30天之前的DateTime(即,時間戳比30天更近),則if塊將打印該行,否則它將忽略該行

假設文件包含以下內容:

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" | set-content "C:\\temp\\newdate.txt"

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

您可以通過以下方式獲得所需的輸出:

$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) }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM