2013-04-29 66 views
2

新手在PS這裏,但我有一個日誌文件,其中每個條目都寫在這個日期格式的單獨行上:2013-04-29 08:55:09,261在文本文件中刪除基於時間戳的行PowerShell

我想使用PowerShell刪除所有超過30天的行。我一直試圖用某種比代碼更好的方式插入get-date -format「yyyy-MM-dd hh」輸出,但是現在我只是在猜測。也一直在嘗試使用批處理文件進行文件處理,但是如果可以的話,我想要堅持使用PS。

任何幫助將不勝感激。

+0

,如果你表現出你的實際代碼這將有助於大大結果。即使它不起作用,它也給了人們一個起點。 – alroc 2013-04-29 20:12:24

回答

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年3月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"

+0

+1我會這樣做。 – 2013-04-30 09:42:55

+0

此線程中的大部分代碼運行良好,並提供了期望的結果。唯一的區別是運行時間。因爲它跑得快一點,所以我選擇了這款遊戲,但任何碰到這個遊戲的人都應該有一些選擇,並且所有人都應該很好地工作。我會盡力評論其他的貢獻,並給出我的結果。謝謝大家,非常有幫助。 – olirm 2013-04-30 11:50:59

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返回與正則e相匹配的時間戳XPRESSION
  • [datetime]類型轉換操作者它前面將其轉換爲一個DateTime對象(爲了比較它另一個日期時間)
  • (Get-Date)返回表示當前的日期和時間的日期時間對象,並.AddDays(-30)減去30天它,返回代表30天前
  • 對於在日誌文件中的每一行DateTime對象,該if版畫如果代表該行的時間戳的日期時間,比表示在30天前的日期時間越線(即時間戳比近期更30天),否則忽略該行
+0

Upvote的整潔的解釋 – Benny 2014-07-17 04:18:17

1

阿迪因巴爾的回答是好,但如果你願意,以避免正則表達式,這裏的另一種方式:

Get-Content e:\pathto\logfile.txt | Where-Object { ((Get-Date) - (Get-Date $_.Substring(0,10))).Days -le 30} | Add-Content e:\pathto\NewLog.txt 
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) } 
+0

這一個去掉了超過30天的線路權利,但由於某種原因,它失去了什麼東西在13:00後,直到第二天。示例2013-04-29 13:07:42,027至2013-04-29 23:57:10,425將會丟失。可能與24小時制格式有關?在PS很初學者,所以不確定,但我想分享我的結果。 – olirm 2013-04-30 11:57:55

+0

@olirm - 是的,我的錯誤,我的格式是指定12小時格式,而不是24 - 固定。 – dugas 2013-04-30 14:40:55

相關問題