新手在PS這裏,但我有一個日誌文件,其中每個條目都寫在這個日期格式的單獨行上:2013-04-29 08:55:09,261在文本文件中刪除基於時間戳的行PowerShell
我想使用PowerShell刪除所有超過30天的行。我一直試圖用某種比代碼更好的方式插入get-date -format「yyyy-MM-dd hh」輸出,但是現在我只是在猜測。也一直在嘗試使用批處理文件進行文件處理,但是如果可以的話,我想要堅持使用PS。
任何幫助將不勝感激。
新手在PS這裏,但我有一個日誌文件,其中每個條目都寫在這個日期格式的單獨行上:2013-04-29 08:55:09,261在文本文件中刪除基於時間戳的行PowerShell
我想使用PowerShell刪除所有超過30天的行。我一直試圖用某種比代碼更好的方式插入get-date -format「yyyy-MM-dd hh」輸出,但是現在我只是在猜測。也一直在嘗試使用批處理文件進行文件處理,但是如果可以的話,我想要堅持使用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年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"
+1我會這樣做。 – 2013-04-30 09:42:55
此線程中的大部分代碼運行良好,並提供了期望的結果。唯一的區別是運行時間。因爲它跑得快一點,所以我選擇了這款遊戲,但任何碰到這個遊戲的人都應該有一些選擇,並且所有人都應該很好地工作。我會盡力評論其他的貢獻,並給出我的結果。謝謝大家,非常有幫助。 – olirm 2013-04-30 11:50:59
試試這個:這些組分
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天前if
版畫如果代表該行的時間戳的日期時間,比表示在30天前的日期時間越線(即時間戳比近期更30天),否則忽略該行Upvote的整潔的解釋 – Benny 2014-07-17 04:18:17
阿迪因巴爾的回答是好,但如果你願意,以避免正則表達式,這裏的另一種方式:
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) }
,如果你表現出你的實際代碼這將有助於大大結果。即使它不起作用,它也給了人們一個起點。 – alroc 2013-04-29 20:12:24