Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Правильно распарсить лог FFprobe (http://forum.oszone.net/showthread.php?t=342972)

Uragan66 17-11-2019 09:30 2896725

Правильно распарсить лог FFprobe
 
Добрый день всем!
Возникла небольшая проблема с рег. выражением.
По ссылкам посредством 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)"}

Вроде всё правильно, но код не работает. По одному значения вытаскиваются без проблем, а вместе ни в какую...
Подскажите, пожалуйста, где ошибка в моём коде ? Или может по-другому можно решить эту задачу ?

DJ Mogarych 17-11-2019 09:47 2896727

Код:

$log = (gc .\log\ffprobe-20191116-213815.log -Encoding utf8 |
Select-String "from|service_name") -split '"'

$log[3]
$log[8]


Uragan66 17-11-2019 11:45 2896734

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

Iska 17-11-2019 12:53 2896754

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

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

Uragan66 17-11-2019 13:22 2896759

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

DJ Mogarych 17-11-2019 19:42 2896856

Код:

(gc .\log\alllog.log -enc utf8 |Select-String "from|service_name") -replace "^.*from '|':$|^.*:\s"

Uragan66 17-11-2019 20:15 2896865

DJ Mogarych, ещё раз моя большая благодарность!
Код работает отлично.
А не подскажете почему простые рег. выражения не работают с этим логом ?
В дальнейшем взятые значения нужно поменять местами и добавить к значению "service_name" подстроку.
Простой Regex в цикле не работает
Код:

ForEach {$_ -replace "(.*)`n(.*)","#EXTINF:-1,`$2`n`$1"}
пробовал и по конвееру и с сохранением значений в промежуточный файл, не работает...

DJ Mogarych 17-11-2019 20:30 2896872

Потому что после 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



Время: 00:31.

Время: 00:31.
© OSzone.net 2001-