Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Правильно распарсить лог FFprobe

Ответить
Настройки темы
PowerShell - Правильно распарсить лог FFprobe

Старожил


Сообщения: 226
Благодарности: 20

Профиль | Отправить PM | Цитировать


Добрый день всем!
Возникла небольшая проблема с рег. выражением.
По ссылкам посредством FFprobe получаю данные о видеопотоках.
Лог такого содержания:
Код: Выделить весь код
ffprobe started on 2019-11-16 at 21:38:15
Report written to "ffprobe-20191116-213815.log"
Command line:
"I:\\\xd1\xea\xf0\xe8\xef\xf2\xfb Python\\udp_parser\\log\\ffprobe.exe" -hide_banner -show_streams -timeout 500000 http://109.200.253.165:4022/udp/224.5.1.1:1234 -report
[NULL @ 01284e40] Opening "http://109.200.253.165:4022/udp/224.5.1.1:1234" for reading
[http @ 0126e000] Setting default whitelist "http,https,tls,rtp,tcp,udp,crypto,httpproxy"
[tcp @ 01272f80] Original list of addresses:
[tcp @ 01272f80] Address 92.244.96.211 port 443
[tcp @ 01272f80] Interleaved list of addresses:
[tcp @ 01272f80] Address 92.244.96.211 port 443
[tcp @ 01272f80] Starting connection attempt to 92.244.96.211 port 443
[tcp @ 01272f80] Successfully connected to 92.244.96.211 port 443
[http @ 0126e000] request: GET /udp/239.0.0.1:1234 HTTP/1.1

User-Agent: Lavf/58.20.100

Accept: */*

Range: bytes=0-

Connection: close

Host: 92.244.96.211:443

Icy-MetaData: 1




[mpegts @ 01284e40] Format mpegts probed with size=2048 and score=50
[mpegts @ 01284e40] stream=0 stream_type=2 pid=f1 prog_reg_desc=CUEI
[mpegts @ 01284e40] stream=1 stream_type=3 pid=f2 prog_reg_desc=CUEI
[mpegts @ 01284e40] Before avformat_find_stream_info() pos: 0 bytes read:37960 seeks:0 nb_streams:3
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Invalid frame dimensions 0x0.
[mpeg2video @ 0128adc0] Format yuv420p chosen by get_format().
[mpegts @ 01284e40] max_analyze_duration 5000000 reached at 5016000 microseconds st:1
[mpegts @ 01284e40] After avformat_find_stream_info() pos: 2088304 bytes read:2090696 seeks:0 frames:338
"from":"http://109.200.253.165:4022/udp/224.5.1.1:1234"
  Duration: N/A, start: 26217.541478, bitrate: N/A
  Program 4 
    Metadata:
      "service_name":"NOVY CHANNEL"
      service_provider: Harmonic
    Stream #0:0[0xf1], 127, 1/90000: Video: mpeg2video (Main) ([2][0][0][0] / 0x0002), yuv420p(tv, top first), 720x576 [SAR 64:45 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:1[0xf2], 211, 1/90000: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
    Stream #0:2[0x59], 0, 1/90000: Data: scte_35
Unsupported codec with id 98305 for input stream 2
[AVIOContext @ 0128eec0] Statistics: 2090696 bytes read, 0 seeks
ffprobe started on 2019-11-16 at 21:38:21
Report written to "ffprobe-20191116-213821.log"
Необходимо вытащить данные из строк "from": и "service_name":
Написал код:
Код: Выделить весь код
(Get-Content .\log\ffprobe-20191116-213815.log -Encoding utf8 `
| Select-String -Encoding utf8 -Pattern '"from":"([^"]+)"[\S\s]*"service_name":"([^"]+)"[\S\s]*' `
-AllMatches).Matches | ForEach-Object {"$($_.Groups[2].Value)`n$($_.Groups[1].Value)"}
Вроде всё правильно, но код не работает. По одному значения вытаскиваются без проблем, а вместе ни в какую...
Подскажите, пожалуйста, где ошибка в моём коде ? Или может по-другому можно решить эту задачу ?

Отправлено: 09:30, 17-11-2019

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
$log = (gc .\log\ffprobe-20191116-213815.log -Encoding utf8 |
Select-String "from|service_name") -split '"'

$log[3]
$log[8]

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 09:47, 17-11-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 226
Благодарности: 20

Профиль | Отправить PM | Цитировать


DJ Mogarych, спасибо большое!
Ваш код с моим примером работает. Но в примере привёл только часть лога, в реальности значений "from" и "service_name" значительно больше, до 255
По Вашему коду берутся только первые значения. Нужно как-то цикл организовать, но как, не пойму...

Отправлено: 11:45, 17-11-2019 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Uragan66, а откуда бы он мог понять, сколько там у Вас этих значений «в реальности»? Регулярные выражения вообще очень критичны к конкретному содержанию.

Можете упаковать весь лог в архив, каковой приложить к сообщению, або выложить на вменяемый обменник/облако.
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:53, 17-11-2019 | #4


Старожил


Сообщения: 226
Благодарности: 20

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip log_ffprobe.zip
(35.5 Kb, 1 просмотров)

Iska, да, моя вина, как-то не подумал об этом
прикрепил логи, alllog.log - реальный выход ffprobe
log_ffprobe.log - немного изменённый для удобства парсинга.

Последний раз редактировалось Uragan66, 29-08-2020 в 20:05.


Отправлено: 13:22, 17-11-2019 | #5


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


Код: Выделить весь код
(gc .\log\alllog.log -enc utf8 |Select-String "from|service_name") -replace "^.*from '|':$|^.*:\s"

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:42, 17-11-2019 | #6


Старожил


Сообщения: 226
Благодарности: 20

Профиль | Отправить PM | Цитировать


DJ Mogarych, ещё раз моя большая благодарность!
Код работает отлично.
А не подскажете почему простые рег. выражения не работают с этим логом ?
В дальнейшем взятые значения нужно поменять местами и добавить к значению "service_name" подстроку.
Простой Regex в цикле не работает
Код: Выделить весь код
ForEach {$_ -replace "(.*)`n(.*)","#EXTINF:-1,`$2`n`$1"}
пробовал и по конвееру и с сохранением значений в промежуточный файл, не работает...

Отправлено: 20:15, 17-11-2019 | #7


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6626
Благодарности: 1528

Профиль | Отправить PM | Цитировать


Потому что после get-content получается массив и со строки на строку перескочить не получится.
Можно попробовать импортировать файл с флагом -raw, тогда он будет одним куском.

Вариант с выгрузкой в CSV:
Код: Выделить весь код
((gc .\log\alllog.log -enc utf8 |Select-String "service_name|from") -replace "^.*from '|':$|^.*:\s") `
-join "`n" -replace ":1234`n",":1234;"|Convertfrom-Csv -Header 'URL','Name' -Delimiter ';' |
Export-Csv .\log\alllog.csv -delimiter ';' -enc utf8 -NoTypeInformation

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 17-11-2019 в 21:07.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:30, 17-11-2019 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Правильно распарсить лог FFprobe

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как правильно разделить HDD на лог. диски? addins Хочу все знать 2 16-07-2016 14:18
CMD/BAT - [решено] Распарсить имя файла KYI Скриптовые языки администрирования Windows 2 13-11-2015 12:53
PowerShell - [решено] Распарсить datetime pogo Скриптовые языки администрирования Windows 1 09-10-2015 11:31
PowerShell - [решено] Распарсить строку milligan Скриптовые языки администрирования Windows 6 02-07-2014 11:18
CMD/BAT - Чем бы распарсить .doc ? mitiya Скриптовые языки администрирования Windows 5 29-11-2010 14:14




 
Переход