Powershell 从日志文件获取最后30分钟
我有一个日志文件,我只想使用powershell脚本检索该文件上最后30分钟的日志Powershell 从日志文件获取最后30分钟,powershell,scripting,Powershell,Scripting,我有一个日志文件,我只想使用powershell脚本检索该文件上最后30分钟的日志 23:59:58 02/01/2020 multiple fields 23:59:58 02/01/2020 multiple fields 23:59:58 02/01/2020 multiple fields 23:59:58 02/01/2020 multiple fields 我知道我可以使用 $Date = Get-Date 这是返回的格式 lunes, 24 de febrero de 2020
23:59:58 02/01/2020 multiple fields
23:59:58 02/01/2020 multiple fields
23:59:58 02/01/2020 multiple fields
23:59:58 02/01/2020 multiple fields
我知道我可以使用
$Date = Get-Date
这是返回的格式
lunes, 24 de febrero de 2020 10:30:38
如何使用此功能仅从las 30分钟中检索日志?-您可以将文件作为csv导入,并使用DateTime功能比较日期和时间以获取所需内容 示例代码:(因为您的文件没有标题,所以必须在标题中使用一些名称
$expectedTime = (Get-Date).AddMinutes(-30)
Import-Csv C:\temp\file.txt -Delimiter " " -Header Time, Date, field1, field2 `
| ? { (([DateTime]$_.Date) + $_.Time) -gt $expectedTime}
如果没有订单,您可以执行以下操作,前提是您的日志位于
log.log
:
$TargetTime = (Get-Date).AddMinutes(-30)
switch -File log.log {
{ [datetime]($_ -replace "(^\S+\s\S+).*",'$1') -ge $TargetTime } {
$_
}
}
-replace
运算符使用正则表达式匹配字符串,然后替换匹配的字符串。$1
是捕获组1,它是由匹配的字符串(^\S+\S+
)
是字符串的开头^
将非空格匹配一次或多次(\S+
)+
匹配空白字符\s
是使用贪婪匹配的0个或多个字符。这意味着在捕获组之后匹配所有字符*
使用
Where Object
条件和您最喜欢的文件读取方法,您可以有效地执行上述操作。如果没有内存限制,则切换速度会更快
$TargetTime = (Get-Date).AddMinutes(-30)
Get-Content log.log | where {
[datetime]($_ -replace "(^\S+\s\S+).*",'$1') -ge $TargetTime
}
如果数据按时间升序排列,则可以使用where()
方法和SkipUntil
模式
$TargetTime = (Get-Date).AddMinutes(-30)
(Get-Content log.log).where({
[datetime]($_ -replace "(^\S+\s\S+).*",'$1') -ge $TargetTime
},'SkipUntil')
我们可以假定文件中的行总是按时间顺序(从最早到最新)排列吗?是的,它们是按时间顺序排列的(从最早到最新),但有些日志可以具有相同的时间戳“$”是什么意思在开关内部做什么?我不能通过管道传输开关的输出来进一步过滤结果,但在您的最后一个示例中,我可以。$是正在处理的当前项。这里是一行的内容。您可以通过管道传输开关,只需用$()
然后你可以通过管道将其传输到其他地方。谢谢,@AdminOfThings,使用switch需要2:44分钟,使用Get Content需要3:14分钟,这台机器有24 gb的内存,刚刚增加了一个百分点。运行任务时,如果由于某种原因,内存使用量增加到了他的极限,我应该担心)