LINUX.ORG.RU

Помогите отпарсить вывод deluge

 , ,


0

3

staromand@lightrail:~$ uname -srv
Linux 4.4.0-31-generic #50-Ubuntu SMP Wed Jul 13 00:06:14 UTC 2016

Всем доброго времени суток. Появилась необходимость в получении информации о текущем состоянии торрентов. Помогите разобраться, как правильно пользоваться конструкцией $BASH_REMATCH[$i] вкупе с циклами. Гуглится на эту тему, как ни странно, очень мало. Накостылял маленький тестовый скрипт, который к моему ожиданию должен вывести имена торрент-объектов текущего процесса, но выводит почему-то только последнюю запись из вывода программы.

#!/bin/bash

meat=`deluge-console info`;
axe=".*?Name:\s(.*?)ID:.*?";

if [[ $meat =~ $axe ]]; then
        i=1
        n=${#BASH_REMATCH[*]}

        while [[ $i -lt $n ]]
        do
                echo -e "piece[$i]: \x1b[33m${BASH_REMATCH[$i]}\x1b[0m"
                let i++
        done
else
        echo "no meat"
fi
echo $n;

Собственно, «мясо»:

staromand@lightrail:~$ deluge-console info
Name: House M.D ID: 51280d59f9f983610c1848b3135cec8e2f52fbc0 State: Downloading Down Speed: 0.0 КБ/с Up Speed: 0.0 КБ/с Seeds: 0 (0) Peers: 0 (3) Availability: 0.19 Size: 11.9 ГБ/63.8 ГБ Ratio: 0.537 Seed time: 0 days 00:00:00 Active: 7 days 19:48:07 Tracker status: rustorka.com: Анонс успешно выполнен Progress: 42.04% [#########################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] Name: [2010-2015]Своя правда[WEB-DLRip] ID: 9a879863896f835ce4d7e0f5a3a077871094a40a State: Downloading Down Speed: 0.0 КБ/с Up Speed: 0.0 КБ/с Seeds: 0 (1) Peers: 0 (2) Availability: 0.15 Size: 6.3 ГБ/41.3 ГБ Ratio: 0.000 Seed time: 0 days 00:00:00 Active: 2 days 03:38:41 Tracker status: rustorka.com: Анонс успешно выполнен Progress: 30.28% [##################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] Name: [2011-2013]Чужой среди своих[HDTVRip] ID: 272942de9a1cb56f69837a714aa791018dd67deb State: Downloading Down Speed: 0.0 КБ/с Up Speed: 0.0 КБ/с Seeds: 0 (2) Peers: 0 (1) Availability: 0.20 Size: 4.3 ГБ/21.2 ГБ Ratio: 0.000 Seed time: 0 days 00:00:00 Active: 7 days 19:57:10 Tracker status: rustorka.com: Анонс успешно выполнен Progress: 29.03% [#################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~] Name: [2014-2016]Сотня[WEB-DLRip] ID: 67a91b8e38fe7be18f953dbd0a6f109f414e6b7e State: Seeding Up Speed: 0.0 КБ/с Seeds: 0 (2) Peers: 0 (2) Availability: 0.04 Size: 1005.5 МБ/22.1 ГБ Ratio: 0.000 Seed time: 0 days 00:00:00 Active: 0 days 05:44:26 Tracker status: rustorka.com: Анонс успешно выполнен Name: Проповедник - 1 Сезон ID: 0220b2cc369dde095824d0bee273bb4e251b1a2d State: Seeding Up Speed: 0.0 КБ/с Seeds: 0 (9) Peers: 0 (8) Availability: 0.00 Size: 15.6 ГБ/15.6 ГБ Ratio: 0.158 Seed time: 7 days 21:01:57 Active: 8 days 14:29:10 Tracker status: rustorka.com: Анонс успешно выполнен Name: Системный администратор (2014) ID: a8b74bfce5271f28834e5b187a8e2adeca6ea960 State: Seeding Up Speed: 0.0 КБ/с Seeds: 0 (4) Peers: 0 (0) Availability: 0.00 Size: 5.5 ГБ/5.5 ГБ Ratio: 0.042 Seed time: 7 days 22:02:07 Active: 8 days 14:25:30 Tracker status: rustorka.com: Анонс успешно выполнен

ЧЯДНТ? У меня есть подозрение, что не хватает модификатора /.../g регулярки, но не знаю, как его установить. Здесь (https://regex101.com/) всё получается.



Последнее исправление: staromand (всего исправлений: 3)

Собственно, «мясо»:

Точно? По-моему, это каша какая-то. Должен быть, наверное, многострочный вывод.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

При работе в скрипте (проверено) или при выводе в файл «делюге» почему-то одной строкой выводит. А если командой спросить в терминале, то многострочный.

По сути это ведь не имеет значения, верно? Для регулярки разве категорично, когда мы в выражении ставим \s, будет это пробел или перевод строки? Тем более, regex101.com нормально переваривает такую «кашу».

staromand
() автор топика
Ответ на: комментарий от staromand

При работе в скрипте (проверено) или при выводе в файл «делюге» почему-то одной строкой выводит.

Всякая дурь, конечно, на свете бывает, но что-то не верится. Перепроверьте-ка.

А если командой спросить в терминале, то многострочный.

Однако вы не без помощи местного парсера его скомкали в кашу.

По сути это ведь не имеет значения, верно?

Здрасьте! Как это не имеет? Вы что вообще от нас хотите — чтоб кто-нибудь помог решить задачу, верно? И как вы это предлагаете ее решать без корректных вводных?

Для регулярки разве категорично, когда мы в выражении ставим \s, будет это пробел или перевод строки?

Во-первых, по-моему, да. А во-вторых, почему вы вообще решили, что здесь нужны какие-то регулярные выражения?

Здесь (https://regex101.com/) всё получается.

Что это вообще? Проприетарщина какая-то.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Всякая дурь, конечно, на свете бывает, но что-то не верится. Перепроверьте-ка.

Да, я тут пытаюсь взять ответ в переменную $a и вывести на дисплей и в файл:

#!/bin/bash

a=`deluge-console info`;
echo $a;
echo $a>/home/staromand/bullshit.txt

Но результат один и у меня ещё ни разу не получалось вывести ответ построчно.

staromand
() автор топика
Ответ на: комментарий от Zmicier

почему вы вообще решили, что здесь нужны какие-то регулярные выражения?

Потому, что, как только мы разберемся с проблемой, мне нужны будут строки с размерами, состояниями, датами добавления торрентов и т.д., а в зависимости от этого самого состояния местонахождение этих строк разное.

staromand
() автор топика
Ответ на: комментарий от staromand

echo $a

Жаль, что у вас еще что-нибудь интересное не вылезло. Звездочка, например, не раскрылась. Было бы нагляднее видно, что строковые переменные надо забирать кавычками.

a=`deluge-console info`

А вообще так делать не надо. Текстовые потоки целесообразно обрабатывать построчно.

Zmicier ★★★★★
()
Ответ на: комментарий от staromand

местонахождение этих строк разное

Я правильно по этому, а так же потому, что вы до сих пор не привели образец вывода понял, что собственно помощь в его разборе вам не нужна?

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Я поправил код в соответствии с замечаниями. Теперь он выглядит так:

#!/bin/bash

meat=$(deluge-console info);
axe=".*?Name:[[:space:]](.*?)[[:space:]]ID:";

if [[ $meat =~ $axe ]]; then
        i=1
        n=${#BASH_REMATCH[*]}

        while [[ $i -lt $n ]]
        do
                echo -e "piece[$i]: \x1b[33m${BASH_REMATCH[$i]}\x1b[0m"
                let i++
        done
else
        echo "no meat"
fi
echo $n;

Я правильно по этому, а так же потому, что вы до сих пор не привели образец вывода понял, что собственно помощь в его разборе вам не нужна?

staromand@lightrail:~$ ./showt
piece[1]: Системный администратор (2014)
2

staromand
() автор топика
Ответ на: комментарий от staromand

Вывод теперь построчный, но это пока, к сожалению, не решило проблему

staromand
() автор топика
Ответ на: комментарий от staromand

Теперь он выглядит так

Что мне совершенно не к чему знать, поскольку я понятия не имею, что́ он должен по-вашему делать.

staromand@lightrail:~$ ./showt
piece[1]: Системный администратор (2014)
2

???

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Ну, вывод команды из скрипта следующий: (всё нормально - вывод построчный. На вход регекспу идёт построчный вариант)

Name: House M.D
ID: 51280d59f9f983610c1848b3135cec8e2f52fbc0
State: Downloading Down Speed: 0.0 КБ/с Up Speed: 0.0 КБ/с
Seeds: 0 (0) Peers: 0 (3) Availability: 0.19
Size: 11.9 ГБ/63.8 ГБ Ratio: 0.537
Seed time: 0 days 00:00:00 Active: 7 days 17:34:11
Tracker status: rustorka.com: Анонс успешно выполнен
Progress: 42.04% [#########################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~]
 
Name: [2010-2015]Своя правда[WEB-DLRip]
ID: 9a879863896f835ce4d7e0f5a3a077871094a40a
State: Downloading Down Speed: 0.0 КБ/с Up Speed: 0.0 КБ/с
Seeds: 0 (1) Peers: 0 (2) Availability: 0.15
Size: 6.3 ГБ/41.3 ГБ Ratio: 0.000
Seed time: 0 days 00:00:00 Active: 2 days 01:24:45
Tracker status: rustorka.com: Анонс успешно выполнен
Progress: 30.28% [##################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~]
 
Name: [2011-2013]Чужой среди своих[HDTVRip]
ID: 272942de9a1cb56f69837a714aa791018dd67deb
State: Downloading Down Speed: 0.0 КБ/с Up Speed: 0.0 КБ/с
Seeds: 0 (2) Peers: 0 (1) Availability: 0.20
Size: 4.3 ГБ/21.2 ГБ Ratio: 0.000
Seed time: 0 days 00:00:00 Active: 7 days 17:43:14
Tracker status: rustorka.com: Анонс успешно выполнен
Progress: 29.03% [#################~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~]
 
Name: [2014-2016]Сотня[WEB-DLRip]
ID: 67a91b8e38fe7be18f953dbd0a6f109f414e6b7e
State: Seeding Up Speed: 0.0 КБ/с
Seeds: 0 (3) Peers: 0 (2) Availability: 0.04
Size: 1005.5 МБ/22.1 ГБ Ratio: 0.000
Seed time: 0 days 00:00:00 Active: 0 days 03:30:30
Tracker status: rustorka.com: Анонс успешно выполнен
 
Name: Проповедник - 1 Сезон
ID: 0220b2cc369dde095824d0bee273bb4e251b1a2d
State: Seeding Up Speed: 0.0 КБ/с
Seeds: 0 (10) Peers: 0 (8) Availability: 0.00
Size: 15.6 ГБ/15.6 ГБ Ratio: 0.158
Seed time: 7 days 18:48:01 Active: 8 days 12:15:14
Tracker status: rustorka.com: Анонс успешно выполнен
 
Name: Системный администратор (2014)
ID: a8b74bfce5271f28834e5b187a8e2adeca6ea960
State: Seeding Up Speed: 0.0 КБ/с
Seeds: 0 (6) Peers: 0 (0) Availability: 0.00
Size: 5.5 ГБ/5.5 ГБ Ratio: 0.042
Seed time: 7 days 19:48:11 Active: 8 days 12:11:34
Tracker status: rustorka.com: Анонс успешно выполнен

Я хочу видеть результат работы скрипта таким:

staromand@lightrail:~$ ./showt
piece[1]: House M.D
piece[2]: [2010-2015]Своя правда[WEB-DLRip]
piece[3]: [2011-2013]Чужой среди своих[HDTVRip]
piece[4]: [2014-2016]Сотня[WEB-DLRip]
piece[5]: Проповедник - 1 Сезон
piece[6]: Системный администратор (2014)
7

staromand
() автор топика

У Deluge есть Web UI, который получает список торрентов, посылая запрос. Приходит JSON с запрошенными параметрами. В итоге это может оказаться проще, чем парсить вывод, не предназначенный для машинной обработки.

i-rinat ★★★★★
()
Ответ на: комментарий от staromand

вывод [deluge-console] следующий

Слава аллаху, наконец-то. Только этот вывод не похож на машиночитаемый. Без знания полного синтаксиса он в общем случае неразбираем.

Я хочу видеть результат работы скрипта таким:

Но одни имена извлечь, разумеется, не проблема:

#!/bin/bash

while read key value; do
    case "$key" in
        'Name:')
            printf 'piece[%d]: %s\n' $((++i)) "$value"
            ;;
    esac
done < \
     <(deluge-console info)

Не проверял.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

А для чего же он?

Конвейеры, работа с приложениями, процессами, фс etc. Для обработки данных его не очень удобно использовать.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

работа с приложениями

?

процессами, фс

??? В Баше из средств для «работы с ФС»: смена текущего каталога и выборка файлов по шаблону имени. Все. Что тут наработаешь?

А вот для обработки текста как раз кое-что есть. И для разбора вывода большинства программ этого «кое-чего» за глаза достаточно.

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

А вот для обработки текста как раз кое-что есть. И для разбора вывода большинства программ этого «кое-чего» за глаза достаточно.

Я не спорю, можно и рогалик написать на баше. Просто на чем-нибудь другом это проще и удобнее делать.

crutch_master ★★★★★
()
Ответ на: комментарий от Zmicier

Но одни имена извлечь, разумеется, не проблема

Спасибо, это решает задачу.В принципе, это поможет и с остальными полями, а лишнее sed'ом или grep'ом повырезаю. И как всегда остался осадок от того, что не получилось решить её с $BASH_REMATCH. Жду ответа насчет этого.

У Deluge есть Web UI, который получает список торрентов, посылая запрос. Приходит JSON с запрошенными параметрами. В итоге это может оказаться проще, чем парсить вывод, не предназначенный для машинной обработки.

О варианте с JSON не догадывался и даже мало знаком с таким средством. Знаю, что довольно удобно, можно поизучать. Спасибо за идею.

staromand
() автор топика
Ответ на: комментарий от staromand

Спасибо, это решает задачу.

Ага. Всегда пожалуйста.

В принципе, это поможет и с остальными полями

Если вы знаете полный синтаксис (перечень всех ключевых слов, вероятно, понадобится), то вероятно, да, этот немашиночитаемый формат можно разобрать.

а лишнее sed'ом или grep'ом повырезаю

Нет, они здесь точно не нужны.

не получилось решить ее с $BASH_REMATCH. Жду ответа насчет этого.

Какого ответа вы ждете? Вопреки вашим предположениям, регулярные выражения здесь не нужны.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Какого ответа вы ждете? Вопреки вашим предположениям, регулярные выражения здесь не нужны.

Ну это ясно уже. Мной овладевает некий дискомфорт, когда метод, которым пытаюсь решить проблему, никак не поддаётся. Хоть и, как в данном случае, есть решение другим способом.

staromand
() автор топика
Ответ на: комментарий от staromand

Начало и конец строки легко отрезать, признаки есть

Вам поможет preg_split из php

ism ★★★
()
Ответ на: комментарий от staromand

Мной овладевает некий дискомфорт, когда метод, которым пытаюсь решить проблему, никак не поддаётся.

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

while read line; do
    if [[ $line =~ ^Name:\ (.*)$ ]]; then
        printf 'piece[%d]: %s\n' $((++i)) "${BASH_REMATCH[1]}"
        continue
    fi
done < \
     <(deluge-console info)
Zmicier ★★★★★
()
Ответ на: комментарий от ism

Да хоть питон. Парсить башем всё равно, что кувалдой гвозди забивать.

crutch_master ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.