Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/57: Рейтинг темы: голосов - 57, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 08.09.2018
Сообщений: 4

Нужен скрипт для парсинга лога

08.09.2018, 13:45. Показов 12004. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день.
Прошу помощи у гуру, вот задание

Необходимо автоматизировать поиск минимального, максимального и среднего времени выполнения задачи ReceiveDltEventsJob из файла с логами trace.log за заданный период времени. (tracer.log прикрепил trace.rar) пробую делать это в LogParser не все получается, хочу посмотреть пример как это можно сделать в Powershell.
Если не сложно описать какая команда за что отвечает какова логика решения, заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2018, 13:45
Ответы с готовыми решениями:

Скрипт для парсинга страницы
Здравствуйте необходимо помочь починить sh скрипт, данный скрипт подключается по ip, парсит страницу по методам из файла <!DOCTYPE...

Скрипт для парсинга информации
Нам необходимо реализовать скрипт, который бы выделял из файла заголовки, то есть информацию заключенную между <span...

Скрипт для парсинга html на bash
Собственно задача: Спарсить html-страницу с помощью bash-скрипта. Гуглил. Везде предлагают регулярки. Меня регулярки не устраивают.

6
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.09.2018, 12:50
Лучший ответ Сообщение было отмечено tornado_net как решение

Решение

Цитата Сообщение от tornado_net Посмотреть сообщение
хочу посмотреть пример как это можно сделать в Powershell
Вот один из простых вариантов:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$log = 'C:\Temp\trace.log'
$items = (Select-String -Pattern "\[ReceiveDltEventsJob\] job started|\[ReceiveDltEventsJob\] job finished" $log).Line | Select-String -Pattern "\d+:\d+:\d+"
 
$i = 0; $result = @()
foreach ($item in $items)
{
    if ($i%2 -eq 0) {$Start = Get-Date $item.Matches.Value}
    else {$result += (Get-Date $item.Matches.Value) - $Start}
    $i++
}
 
cls
($list).TotalMilliseconds
$result | Measure-Object TotalMilliseconds -Maximum -Minimum -Average
Цитата Сообщение от tornado_net Посмотреть сообщение
Если не сложно описать какая команда за что отвечает
PowerShell
1
2
3
Get-Help Select-String
Get-Help Get-Date
Get-Help Measure-Object
Цитата Сообщение от tornado_net Посмотреть сообщение
какова логика решения
Выбираем из текста все строчки, которые содержат "[ReceiveDltEventsJob] job started" или "[ReceiveDltEventsJob] job finished", а затем в этих строчках выбираем время. В результате у нас получается массив строчек, где каждая чётная (первая с номером 0) - время старта, а нечётная время финиша. Вычитаем из каждого времени финиша время старта и сохраняем полученный результат в ещё один массив ($result). После чего, командлет Measure-Object находит нам в массиве $result - минимальное, максимальное и среднее значение для свойства TotalMilliseconds.

Добавлено через 58 минут
+ вариант №2 - чуть усложним паттерн для регулярного выражения и благодаря этому используем Select-String только один раз, а заодно будем учитывать не только время, но и дату

$item.Matches.Groups[1].Value - дата время
$item.Matches.Groups[2].Value - started или finished

PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
$log = 'C:\Temp\trace.log'
 
$list = @()
foreach ($item in Select-String -Pattern "^(\d+-\d+ \d+:\d+:\d+).+\[ReceiveDltEventsJob\] job (started|finished)" $log)
{
    $date = [datetime]::parseexact($item.Matches.Groups[1].Value, "MM-dd HH:mm:ss", $null)
    if ($item.Matches.Groups[2].Value -eq 'started') {$Start = $date}
    else {$list += $date - $Start}
}
 
cls
($list).TotalMilliseconds
$list | Measure-Object TotalMilliseconds -Maximum -Minimum -Average
1
0 / 0 / 0
Регистрация: 08.09.2018
Сообщений: 4
10.09.2018, 19:12  [ТС]
KDE777, спасибо за помощь, попробовал 1 вариант получил:
Get-Date : Не удается привязать параметр "Date" к целевому объекту. Исключение при задании "Date" : "В экземпляре объекта не задана ссылка на объект."
строка:7 знак:39
+ if ($i%2 -eq 0) {$Start = Get-Date <<<< $item.Matches.Value}
+ CategoryInfo : WriteError: ( [Get-Date], ParameterBindingException
+ FullyQualifiedErrorId : ParameterBindingFailed,Microsoft.PowerSh ell.Commands.GetDateCommand

Попробовал 2-ой получил многократно это:

Не удается индексировать в массив NULL.
строка:6 знак:57
+ $date = [datetime]:arseexact($item.Matches.Groups[ <<<< 1].Value, "MM-dd HH:mm:ss", $null)
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Не удается индексировать в массив NULL.
строка:7 знак:30
+ if ($item.Matches.Groups[ <<<< 2].Value -eq 'started') {$Start = $date}
+ CategoryInfo : InvalidOperation: (2:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

Не удается индексировать в массив NULL.
строка:6 знак:57
+ $date = [datetime]:arseexact($item.Matches.Groups[ <<<< 1].Value, "MM-dd HH:mm:ss", $null)
+ CategoryInfo : InvalidOperation: (1:Int32) [], RuntimeException
+ FullyQualifiedErrorId : NullArray

прошу помочь с ошибками.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
10.09.2018, 19:24
Цитата Сообщение от tornado_net Посмотреть сообщение
Попробовал 2-ой получил многократно это:
Не удается индексировать в массив NULL.
Цитата Сообщение от tornado_net Посмотреть сообщение
прошу помочь с ошибками.
Видимо у вас PowerShell 2.0

PowerShell
1
$PSVersionTable.PSVersion
который уже давно пора обновить...
1
0 / 0 / 0
Регистрация: 08.09.2018
Сообщений: 4
10.09.2018, 20:38  [ТС]
KDE777, Спасибо, вы правы, я обновился и все заработало, а как указать период времени за который необходимо сделать выборку? если лог за несколько дней? или за 4 часа?

хорошо бы еще понимать дату и время максимального времени выполнения.
0
 Аватар для KDE777
1886 / 1108 / 428
Регистрация: 22.01.2016
Сообщений: 3,050
11.09.2018, 10:05
Лучший ответ Сообщение было отмечено tornado_net как решение

Решение

Цитата Сообщение от tornado_net Посмотреть сообщение
а как указать период времени за который необходимо сделать выборку? если лог за несколько дней? или за 4 часа?
хорошо бы еще понимать дату и время максимального времени выполнения.
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$log = 'C:\Temp\trace.log'
 
$LogStart = '18.07.2018 12:00'
$LogEnd = '18.07.2018 14:00'
 
$list = @()
foreach ($item in Select-String -Pattern "^(\d+-\d+ \d+:\d+:\d+).+\[ReceiveDltEventsJob\] job (started|finished)" $log)
{
    $date = [datetime]::parseexact($item.Matches.Groups[1].Value, "MM-dd HH:mm:ss", $null)
    
    if ($date -ge (date $LogStart) -and $date -le (date $LogEnd))
    {
 
        if ($item.Matches.Groups[2].Value -eq 'started') {$Start = $date}
        else
        {
            $list += New-Object PSObject -Property @{
                TotalMilliseconds = ($date - $Start).TotalMilliseconds
                DateStarted = $Start
                DateFinished = $date
            }
        }
    }
 
}
 
cls
$list | ? TotalMilliseconds -ne 0 | sort TotalMilliseconds -des
$list | Measure-Object TotalMilliseconds -Maximum -Minimum -Average
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
TotalMilliseconds DateFinished        DateStarted        
----------------- ------------        -----------        
           398000 18.07.2018 12:19:07 18.07.2018 12:12:29
           383000 18.07.2018 13:59:12 18.07.2018 13:52:49
           141000 18.07.2018 13:42:04 18.07.2018 13:39:43
           134000 18.07.2018 12:08:30 18.07.2018 12:06:16
            93000 18.07.2018 12:05:59 18.07.2018 12:04:26
            90000 18.07.2018 13:48:43 18.07.2018 13:47:13
            84000 18.07.2018 13:52:49 18.07.2018 13:51:25
            40000 18.07.2018 12:09:30 18.07.2018 12:08:50
            38000 18.07.2018 13:49:51 18.07.2018 13:49:13
            25000 18.07.2018 12:09:55 18.07.2018 12:09:30
            21000 18.07.2018 13:42:26 18.07.2018 13:42:05
            18000 18.07.2018 12:01:53 18.07.2018 12:01:35
            12000 18.07.2018 12:12:15 18.07.2018 12:12:03
            10000 18.07.2018 12:44:59 18.07.2018 12:44:49
             9000 18.07.2018 12:01:07 18.07.2018 12:00:58
             7000 18.07.2018 12:08:40 18.07.2018 12:08:33
             6000 18.07.2018 13:48:52 18.07.2018 13:48:46
             5000 18.07.2018 12:08:45 18.07.2018 12:08:40
             4000 18.07.2018 12:11:18 18.07.2018 12:11:14
             3000 18.07.2018 12:11:02 18.07.2018 12:10:59
             3000 18.07.2018 13:48:46 18.07.2018 13:48:43
             3000 18.07.2018 12:03:02 18.07.2018 12:02:59
             3000 18.07.2018 12:44:25 18.07.2018 12:44:22
             2000 18.07.2018 13:48:54 18.07.2018 13:48:52
             2000 18.07.2018 12:03:31 18.07.2018 12:03:29
             2000 18.07.2018 12:02:00 18.07.2018 12:01:58
             1000 18.07.2018 13:46:14 18.07.2018 13:46:13
             1000 18.07.2018 12:00:55 18.07.2018 12:00:54
             1000 18.07.2018 12:35:57 18.07.2018 12:35:56
             1000 18.07.2018 12:28:57 18.07.2018 12:28:56
             1000 18.07.2018 12:23:57 18.07.2018 12:23:56
             1000 18.07.2018 12:23:27 18.07.2018 12:23:26
             1000 18.07.2018 12:19:08 18.07.2018 12:19:07
             1000 18.07.2018 12:11:14 18.07.2018 12:11:13
             1000 18.07.2018 12:11:05 18.07.2018 12:11:04
             1000 18.07.2018 12:03:59 18.07.2018 12:03:58
             1000 18.07.2018 12:02:29 18.07.2018 12:02:28
             1000 18.07.2018 12:47:20 18.07.2018 12:47:19
             1000 18.07.2018 13:59:14 18.07.2018 13:59:13
 
Count    : 206
Average  : 7519,41747572816
Sum      : 
Maximum  : 398000
Minimum  : 0
Property : TotalMilliseconds
1
0 / 0 / 0
Регистрация: 08.09.2018
Сообщений: 4
11.09.2018, 10:50  [ТС]
KDE777, Спасибо, это то что нужно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2018, 10:50
Помогаю со студенческими работами здесь

Скрипт парсинга syslog
Добрый день. Я новичок, пробую освоить Linux (экспериментирую с CetnOS). Возникла необходимость распарсить лог (на примере syslog'a) с...

скрипт парсинга текстового файла
Добрый день! Есть файл вида: 0|06.11.2016|номер||726.53|10.2016|счет|1|39420|3330000015 ...

Скрипт парсинга поисковой выдачи Google
Есть скрипт для парсинга результатов поиска Google, получая на входе ключевое слово и имя домена, на выходе должен вернуть номер позиции в...

Скрипт парсинга html-страницы на PowerShell
Есть некий скрипт, который парсит веб-страницу и выводит на экран содержимое таблицы (список сотрудников с их контактными данными): $uri...

Скрипт парсинга html-страницы на PowerShell
Здравствуйте, уважаемые знатоки! Очень прошу Вас помочь. Задача такая: необходимо написать скрипт (на PowerShell), который будет парсить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru