Получить последние 30 минут из файла журнала - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть файл журнала, и я хочу получить только последние 30 минут журналов этого файла с помощью сценариев powershell.

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

как я могу использовать это для извлечения только журналов за последние 30 минут? -

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Если порядка нет, вы можете сделать следующее, если ваши журналы находятся в 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')
0 голосов
/ 24 февраля 2020

Вы можете импортировать файл как csv и использовать функцию DateTime для сравнения даты и времени, чтобы получить то, что вы ищете.

Пример кода: (Поскольку у вашего файла нет заголовков, вам придется использовать некоторые имена в заголовке.

$expectedTime = (Get-Date).AddMinutes(-30)
Import-Csv C:\temp\file.txt -Delimiter " " -Header Time, Date, field1, field2 `
    | ? { (([DateTime]$_.Date) + $_.Time) -gt $expectedTime}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...