解析最近30分钟的日志条目

时间:2020-08-17 09:44:46

标签: powershell

我正在尝试分析每行开头都有日期的日志。这是一个文本文件:

17.08.2020 11:26:43
17.08.2020 11:26:43 
17.08.2020 11:27:05
17.08.2020 11:29:19

get-date -Format "dd.MM.yyyy hh:mm:ss"

Get-Date将给我正确的格式,但是我如何只列出最近30分钟内说的条目?

2 个答案:

答案 0 :(得分:0)

如果可以将日志文件导入为CSV文件,则此操作非常简单。样本不在乎日期,仅在时间部分。扩展今天的日期处理应该很容易。使用Get-Date.AddMinutes(-30)获取30分钟前的日期。

例如,将分号;视为分隔符,

# Create test data
$cc = ConvertFrom-Csv -Delimiter ";" @'
date;time;content
17.08.2020;11:26:43;data 1
17.08.2020;11:26:43;data 2
17.08.2020;11:27:05;data 3
17.08.2020;11:29:19;data 4
'@

# Use where-object and casting to datetime to filter. Hard-coded time
# so the example works even if event's not within 30 minutes anymore
$cc | ? { [datetime]$_.time -ge [datetime]"11:27:00" }
# Output
date       time     content
----       ----     -------
17.08.2020 11:27:05 data 3
17.08.2020 11:29:19 data 4

如果日志文件中不包含用于将日期和时间与实际消息分开的合适字符,则导入将更加棘手。一种快速而肮脏的方法使用.Substring()方法提取时间并将其转换为日期时间以进行比较。像这样

# Sample data, space separator might be in log message too
$data= @(
'17.08.2020 11:26:43 data 1',
'17.08.2020 11:26:43 data 2',
'17.08.2020 11:27:05 data 3',
'17.08.2020 11:29:19 data 4')

# Use brute force substring to extract time. Error hangling is missing here!
# Change substring parameters to extract the whole datetime part.
$data | ? { [datetime]$_.substring(11,8) -ge [datetime]"11:27:00" }
# Output
date       time     content
----       ----     -------
17.08.2020 11:27:05 data 3
17.08.2020 11:29:19 data 4

答案 1 :(得分:0)

首先,从日志文件中获取所有日期:

$all_dates=Get-Content .\log | Get-date -Format "dd.MM.yyyy hh:mm:ss"

然后获取当前日期:

$current_date=Get-Date -Format "dd.MM.yyyy hh:mm:ss"

然后,遍历所有日期并根据时差进行过滤:

foreach($date in $all_dates){ $ts=New-TimeSpan -Start $date -End $current_date; if (($ts.Minutes -gt 0) -and ($ts.Minutes -lt 30)) { Write-Host $date }}

对于输入,您给出的输出如下(在撰写本文时):

17.08.2020 11:26:43
17.08.2020 11:26:43
17.08.2020 11:27:05