Если порядка нет, вы можете сделать следующее, если ваши журналы находятся в log.log
:
$TargetTime = (Get-Date).AddMinutes(-30)
switch -File log.log {
{ [datetime]($_ -replace "(^\S+\s\S+).*",'$1') -ge $TargetTime } {
$_
}
}
-replace
оператор использует регулярное выражение для сопоставления строки, а затем заменяет сопоставленную строку. $1
- это первая группа захвата, которая представляет собой строку, совпадающую с (^\S+\s\S+)
.
^
- начало строки. \S+
соответствует небелому пробел один или несколько (+
) раз. \s
соответствует символу пробела. .*
равен 0 или более символам с использованием жадного совпадения. Это означает сопоставить все после группы захвата.
Вы можете эффективно сделать то же, что и выше, с условием Where-Object
в сочетании с вашим любимым методом чтения файла. switch
имеет тенденцию работать быстрее, если нет ограничений памяти.
$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')