Bag*_*era 1 powershell parsing
我有一个(纯文本)日志文件,其中的日期出现在大多数(但不是全部)文本行中。日期并不总是出现在每行的相同位置。尽管并非所有行都有日期,但在任何给定的 10 行集合中总会有一个日期。日志示例:
03/05/2019 Event A occurred
03/05/2019 Event B occurred
Event B Details: Details Details
03/07/2019 Event C occurred
Logging completed on 03/08/2019
03/08/2019 Event D occurred
Run Code Online (Sandbox Code Playgroud)
我需要获取最后记录的项目的日期。我不需要该行的内容,只需要该行中的日期。
#Get the log file. Tail it because it's huge. The regex pattern matches date format dd/mm/yyyy.
$log = (Get-Content -tail 10 C:\mylog.log | Select-String -Pattern "\d{2}/\d{2}\/d{4}"
#Get the last item in the $log variable. Convert it to a string.
$string = $log[-1].toString()
#Split the string. Match each element to a date format.
#When an element matches a date format, assign its value to a DateTime variable.
foreach ($s in $string.split() ){
if ($s -match "\d{2}/\d{2}\/d{4}"){
[DateTime]$date = $s
}
}
"The last entry in the log was made on $date"
Run Code Online (Sandbox Code Playgroud)
这段代码的两个部分(找到带有日期的最后一行,并从该行中提取日期)看起来确实很混乱。有一个更好的方法吗?
您可以执行以下操作:
[datetime]((Get-Content mylog.log -tail 10) |
Select-String '\d{2}/\d{2}/\d{4}')[-1].Matches.Value
Run Code Online (Sandbox Code Playgroud)
Select-String返回一个集合MatchInfo
对象。.Matches.Value
每个对象都包含匹配的字符串。使用[-1]
索引,我们可以获取最后一个对象。
注意: Select-String
有一个-Path
参数可以读取文件。但如果您不想读取整个文件,Get-Content -Tail
则使用。