web-dev-qa-db-ja.com

特定の数値を出力するために.jsonを読み取る方法は?

こんにちは私はこれを使用しています:

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

キャッシュフォルダーにweather.jsonファイルを書き込む。出力は this です。問題は、それが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を出力するため、アイコンの値と同じ名前のフォルダーのアイコンを使用して、$ imageを使用してconkyに表示できます。私の質問は、これをどのようにして行うことができるのですか?表示されているパラメーターを使用してfile.jsonを読み取るためのより良いコマンドがあるかどうかはわかりません here または、grepを使用してアイコンの値を出力する方法があるかどうかはわかりません。ありがとう

4
Wonky

IMOこれを行う正しい方法( @ fedonkadifeli によるコメントで提案されている)は、JSON対応のツールを使用して、目的のタイムスタンプを持つリスト要素を選択することです。

たとえば、最初のタイムスタンプ1574629200は本日2019年11月24日16:00 ESTを表し、保存されたweather.jsonファイルでjqを使用します。

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

他の目的で気象データが必要ない場合は、curl出力をファイルに保存するのではなく、jqコマンドに直接パイプすることを検討できます。

特定の時刻を気にしない場合は、firstアイコンをさらに簡単に取得できます

curl ... | jq -r '.list[0].weather[].icon'
8
steeldriver

より適切な答えは、おそらく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