我的问题与它有些相似,但仍然允许我详细说明。我一直在访问一个名为 wttr.in 的天气应用程序,从中可以获取天气信息。这可以很容易地通过 -
$ curl wttr.in/Pune?format=4
现在我很想知道气象站是提供当前数据还是陈旧数据,我知道了一种叫做 j1 格式的东西,它给出了服务器上次更新天气信息的时间。
$ curl wttr.in/Pune?format=j1 | less
上面的查询给了我大量的数据,比如 -
current_condition": [
{
"FeelsLikeC": "18",
"FeelsLikeF": "65",
"cloudcover": "4",
"humidity": "42",
"localObsDateTime": "2021-11-11 12:20 AM",
"observation_time": "06:50 PM",
"precipInches": "0.0",
"precipMM": "0.0",
"pressure": "1012",
"pressureInches": "30",
"temp_C": "18",
现在,如果我使用 grep 我会得到这样的输出 -
$ curl wttr.in/Pune?format=j1 | grep "localObsDateTime"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
2 48685 2 1159 0 0 4199 0 0:00:11 --:--:-- 0:00:11 4184 "localObsDateTime": "2021-11-11 12:20 AM",
100 48685 100 48685 0 0 90830 0 --:--:-- --:--:-- --:--:-- 90661
我听说 jq 可以美化它并且 makt ie 容易,谁能告诉我如何。此外,如果有任何其他方式来获取数据,而不是 curl 也会很有趣。
FWIW 我已经安装了 ja 1.6,最后的 bash 版本是 5.1.8。
与
jq
:输出:
您可以使用:
如果您不知道
localObsDateTime
密钥在 JSON 文档中的确切位置,则必须递归搜索它。您可以这样做,然后使用以下jq
表达式提取其值:这实质上是说“对于文档中的每个单独事物,如果它是一个对象并且有一个名为 的键
localObsDateTime
,则提取该键的值”。您也可以将其缩短为
它说“对于文档中的每个单独的东西,尝试提取
localObsDateTime
值,如果它存在,如果它不存在或它的值为null
,则什么都不给我”。你会这样运行:
或者,
使实用程序返回解码的文本字符串而不是 JSON 字符串的
-r
选项。jq
请注意,上面返回所有
localObsDateTime
键的值。您是否只想要其中的第一个,请改用以下jq
表达式:或者,
这将创建一个包含所有值的数组,然后提取第一个。
请注意,在 URL 中使用
j2
代替j1
会导致回复中的 JSON 文档更小。