В настоящее время я изучаю, как использовать jq с оболочкой в Linux, так как я разрабатываю пользовательские проверки для Check_MK (ранее известный как Nagios), и мое приложение (qBittorrent с их WebUI API ) возвращает строки JSON.
В настоящее время я уже могу подсчитать общее количество торрентов просто с помощью простого jq length
.Теперь я хотел бы посчитать количество торрентов, которые в данный момент загружаются, загружаются или находятся в режиме паузы.Меня интересует только state
, поэтому, если у меня есть 6 торрентов, мой JSON может выглядеть так:
[
{
"state": "uploading"
},
{
"state": "downloading"
},
{
"state": "downloading"
},
{
"state": "downloading"
},
{
"state": "pauseDL"
},
{
"state": "pauseUP"
}
]
Здесь jq length
возвращает 6. Что мне нужно сделать, чтобы получитьдетали, такие как 3, загружаются, 1 загружается, 2 приостановлены и 0 ошибаются?
Вот мой действительный сценарий:
#!/bin/sh
curl -s http://localhost:8080/query/torrents -o /tmp/torrents.json
count=$(jq length /tmp/torrents.json)
echo "0 qbt_Nb_torrents - $count"
Синтаксис для echo
:требуется Check_MK (как объяснено здесь ).
Я прочитал несколько примеров фильтров, но все они, кажется, работают, когда мы фильтруем атрибуты верхнего уровня.Здесь мой верхний уровень в основном просто [0], ..., [5], поэтому он не работает с примерами, которые я нашел в руководстве.
Дополнительная информация
API WebUI сообщает, что существует 12 возможных состояний.Вот как я собираюсь разделить их:
downloading: queuedDL, checkingDL, downloading
uploading: queuedUP, checkingUP, uploading
pause: pausedUP, pausedDL
error: error
stalled: stalledUP, stalledDL, metaDL
В соответствии с синтаксисом CheckMK мне нужно в основном вывести что-то вроде:
0 qbt_Nb_torrents - всего 6, 3 загрузки,1 посев, 2 при паузе, 0 остановлено, 0 ошибка
Первые 0 в начале означают состояние OK для CheckMK.Если есть какие-либо заблокированные торренты, я хочу, чтобы этот статус стал 1, а если есть какой-либо торрент по ошибке, статус становится 2. Пример:
2 qbt_Nb_torrents - всего 8, 3 загрузки, 1засев, 2 на паузе, 1 остановлен, 1 ошибка