Как читать .json для вывода конкретного числа?

Здравствуйте, я использовал это:

curl -s "http://api.openweathermap.org/data/2.5/forecast?id=6361046&APPID=6be5e3a6e62680c28044791e8fc7b568&units=metric" -o ~/.cache/weather.json

, чтобы записать файл weather.json в мою папку кэша. выходной сигнал составляет , этот . проблема в том, что он только в 1 строке, и я пытаюсь использовать grep, чтобы получить вывод значения иконки сегодняшнего дня:

{"cod":"200","message":0,"cnt":40,"list":[{"dt":1574629200,"main":{"temp":12.8,"temp_min":12.8,"temp_max":13.07,"pressure":1020,"sea_level":1020,"grnd_level":1012,"humidity":82,"temp_kf":-0.27},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}]

, в данном случае это «04n», поэтому я могу использовать что-то например:

~/.weather-icons/$(grep "icon" ~/.cache/weather.json).png

, что выдаст ~/.weather-icons/04n.png, чтобы я мог использовать значок из моей папки с тем же именем, что и значение значка, для отображения в conky с использованием $ image. Мой вопрос: как я могу это сделать? Я не знаю, есть ли лучшая команда для чтения файла .json, используя параметры, показанные здесь здесь , или есть ли способ, которым я могу использовать grep, чтобы просто вывести значение иконки. Благодаря

4
задан 25 November 2019 в 13:54

2 ответа

IMO правильный способ сделать это (как предложено в комментарии @fedonkadifeli) должно использовать JSON-осведомленный инструмент для выбора элемента списка с желаемой меткой времени.

, Например, первая метка времени 1574629200 представляет сегодня, 24-го ноября 2019 16:00 EST и использование jq на сохраненном weather.json файл:

$ jq -r --arg dt "$(date +%s -d 'today 16:00:00 EST')" '
    .list[] | select( .dt == ($dt | tonumber) ) | .weather[].icon
  ' weather.json
04n

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

, Если Вы не заботитесь об определенном времени суток, можно стать первыми значок даже проще

curl ... | jq -r '.list[0].weather[].icon'
8
ответ дан 1 December 2019 в 08:58

Лучший ответ может, вероятно, быть сделан с помощью инструмента как jq, но метод грубой силы был бы:

$ head -c400 ~/.cache/weather.xml

{"cod":"200","message":0,"cnt":40,"list":[{"dt":1574629200,"main":{"temp":12.8,"temp_min":12.8,"temp_max":13.07,"pressure":1020,"sea_level":1020,"grnd_level":1012,"humidity":82,"temp_kf":-0.27},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04n"}],"clouds":{"all":92},"wind":{"speed":2.22,"deg":232},"sys":{"pod":"n"},"dt_txt":"2019-11-24 21:00:00"},{"dt":1574640000,"ma

Это отображает первые 400 символов файла, и кажется, что Ваша информация всегда в начале файла?

$ head -c400 ~/.cache/weather.xml | sed 's/.*icon":"//g'

04n"}],"clouds":{"all":92},"wind":{"speed":2.22,"deg":232},"sys":{"pod":"n"},"dt_txt":"2019-11-24 21:00:00"},{"dt":1574640000,"ma

Это удаляет все до и включая "icon":" отъезд 04n, которого Вы требуете в начале строки.

$ head -c400 ~/.cache/weather.xml | sed 's/.*icon":"//g' | sed 's/".*//'

04n

Наконец это дает Вам все, что Вы искали.

Не симпатичный, но это работает.

2
ответ дан 1 December 2019 в 08:58

Другие вопросы по тегам:

Похожие вопросы: