У меня есть бин, ищущий решение для моего вопроса, но не нашел или лучше сказал, что я не получил это с тем, что я нашел. Итак, давайте поговорим о том, о чем моя проблема. Я использую программное обеспечение Smart Home Control на Raspberry Pi, и, как я узнал в эти выходные, используя систему приема-приема, я могу получить данные с моего датчика температуры наружного воздуха. Вывод pilight-receive выглядит так:
{
"message": {
"id": 4095,
"temperature": 409.5
},
"origin": "receiver",
"protocol": "alecto_wsd17",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 3
}
{
"message": {
"id": 1490,
"temperature": 25.1,
"humidity": 40.0,
"battery": 1
},
"origin": "receiver",
"protocol": "alecto_ws1700",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 3
}
{
"message": {
"id": 2039,
"temperature": 409.5
},
"origin": "receiver",
"protocol": "alecto_wsd17",
"uuid": "0000-b8-27-eb-0f3db7",
"repeats": 4
}
Теперь мой вопрос к вам: Как, черт возьми, я могу извлечь температуру и влажность, где идентификатор 1490. И как бы вы посоветовали мне делать это часто? При выполнении задания cron, которое выполняется каждые 10 минут, создается вывод pilight-receive, извлекаются данные этого вывода и отправляется в Api Smart Home Control.
У кого-то есть идея - большое спасибо
источник
awk
иsed
при условии, что вывод JSON сохраняет форматирование, показанное здесь, в этом нет необходимости - пробел не имеет значения для JSON. Например, этаawk
команда:awk '/temperature|humidity/ {print $2}'
близка.ksh93
JSON разбор встроен вread
.Ответы:
Вы можете использовать
jq
для обработки файлов JSON в оболочке.Например, я сохранил ваш файл json как
raul.json
и запустил:jq доступен в готовом виде для большинства дистрибутивов Linux.
Вероятно, есть способ сделать это
jq
сам по себе, но самый простой способ получить оба требуемых значения в одной строке - использоватьxargs
. Например:или, если вы хотите пройтись по каждому
.message.id
экземпляру, мы можем добавить.message.id
к выводу и использовать,xargs -n 3
поскольку мы знаем, что будет три поля (id, температура, влажность):Вы можете затем обработать этот вывод с помощью awk или чего-то еще.
Наконец, и Python, и Perl имеют отличные библиотеки для анализа и обработки данных JSON. Как и несколько других языков, включая php и java.
источник
jq 'select(.message.id == 1490) | .message.temperature, .message.humidity' raul.json
{ read temp; read hum; } < <(jq ...)
grep
. Это может не работать для некоторых конкретных версийgrep
, но это более прямолинейно, чемjq
в этом сценарии, даже еслиjq
оно разработано специально для анализа JSON. Я далjq
ответ, хотя, несмотря ни на что. Это действительно инструмент для работы, но иногда вы можете просто удалить скобы пальцами, а не искать устройство для удаления скрепок.jq
один такой для сценариев оболочки. другие языки имеют библиотеки синтаксического анализа json.jq
это делает?jq
безусловно, самое элегантное решение. Сawk
тобой можно было написатьисточник
Для тех, кто не понимает продвинутый уровень
awk
так хорошо, как ему хотелось бы (например, такие как я) и у которого нетjq
предустановленной системы, простым решением было бы объединить несколько собственных команд, например, так:Если вы только пытаетесь получить значения, проще просто использовать
grep
вместоawk
илиsed
:Чтобы дать объяснение, мне кажется, что это самый простой способ.
grep -A2
Захватывает линию , которую вы ищете в формате JSON вместе со следующим 2 -х линий, которые содержат температуру и влажность.grep -o
просто печатает только числовые цифры, разделенные символом.
(который никогда не будет1490
отображаться в первой строке, поэтому у вас останутся 2 значения - температура и влажность. Очень просто. Наjq
мой взгляд, даже проще, чем использовать .источник
Мой инструмент выбора для обработки JSON в командной строке - jq. Однако, если у вас не установлен jq, вы можете сделать это с Perl:
источник
ваш вывод представляет собой набор фрагментов JSON, а не полный JSON. Если / после того, как вы измените свой вывод на целочисленный JSON, например, вот так (при условии, что ваш вывод находится в
file.json
):тогда легко достичь желаемого с помощью
jtc
инструмента (доступно по адресу: https://github.com/ldn-softdev/jtc ):в приведенном выше примере удалите,
-l
если вы не хотите печатать этикеткиисточник