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

我有一个日志文件,我只想使用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 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的内存,刚刚增加了一个百分点。运行任务时,如果由于某种原因,内存使用量增加到了他的极限,我应该担心)