Разделить лог-файл - PullRequest
       2

Разделить лог-файл

0 голосов
/ 06 ноября 2018

У меня есть файл журнала с этим:

Wed Oct 17 05:39:27 2018 : Resource = 'test04' cstep= 'titi04' time =18.751s 
Wed Oct 17 05:40:31 2018 : Resource = 'test05' cstep= 'titi05' time =58.407s 
Wed Oct 17 05:41:31 2018 : Resource = 'test06' cstep= 'titi06' time =3.400s 
Wed Oct 17 05:42:31 2018 : Resource = 'test07' cstep= 'titi07' time =4.402s 

Я хочу разделить и хочу только значения больше 5:

18.751
58.407

Мой скрипт находится в PowerShell и собирает все значения, а не только значения больше 5:

$list = Get-Content "C:\Users\Desktop\slow_trans\log_file.txt"

$results = foreach ($line in $list) {
    $line.Split('=')[3].Trim().TrimEnd('s')
}

$results

Результаты

18.751 
58.407 
3.400
4.402

Я хочу только

3.400
4.402

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Select-String это один вариант:

(Select-String -Path "TargetLog.txt" -Pattern ".*(?<time>\d+\.\d+)s").Matches |
    ForEach-Object {
        if([double]$_.Groups['time'].Value -lt 5.0) {$_.Value}
    }

Будет выведена вся совпадающая строка:

Wed Oct 17 05:41:31 2018 : Resource = 'test06' cstep= 'titi06' time =3.400s
Wed Oct 17 05:42:31 2018 : Resource = 'test07' cstep= 'titi07' time =4.402s

Если вам нужен только номер из каждой строки, измените блок if на этот:

{$_.Groups['time'].Value}

0 голосов
/ 06 ноября 2018

Изменение требований на лету обычно не требуется, так что вы этого не заслуживаете.
Также формулировка Superior 5 напоминает мне предыдущий вопрос из другой учетной записи пользователя.

Тем не менее здесь скрипт с одним каналом и преобразованием даты и времени.

## Q:\Test\2018\11\06\SO_53170145.ps1
Get-Content .\logfile.txt |
  Where-Object {$_ -match '^(.*?) : .*time =([0-9\.]+)s'}|
    Select-Object @{n='DT';e={([datetime]::ParseExact($Matches[1],'ddd MMM dd HH:mm:ss yyyy',[cultureinfo]::InvariantCulture).ToString('yyyy-MM-dd HH:mm:ss'))}},
                  @{n='val';e={[double]$Matches[2]}} |
      Where-Object val -le 5

Пример вывода (запятая из-за моей немецкой локали)

DT                    val
--                    ---
2018-10-17 05:41:31   3,4
2018-10-17 05:42:31 4,402
0 голосов
/ 06 ноября 2018

следующее преобразует выбранную строку в двойную, а затем возвращает только те, которые меньше 5

$results = Foreach ($line in $list) {
    $val = [double]$line.Split('=')[3].Trim().TrimEnd('s')
    if($val -lt 5) {
        $val
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...