AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 676957
Accepted
shirish
shirish
Asked: 2021-11-11 12:37:28 +0800 CST2021-11-11 12:37:28 +0800 CST 2021-11-11 12:37:28 +0800 CST

如何使用 jq 获取输出,因为它为我提供了单词或字符串进入的整行

  • 772

我的问题与它有些相似,但仍然允许我详细说明。我一直在访问一个名为 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。

grep jq
  • 3 3 个回答
  • 2035 Views

3 个回答

  • Voted
  1. Cyrus
    2021-11-11T13:50:09+08:002021-11-11T13:50:09+08:00

    与jq:

    curl -s 'http://wttr.in/Pune?format=j1' | jq -r '.current_condition[].localObsDateTime'
    

    输出:

    2021-11-11 03:01 AM
    
    • 3
  2. Best Answer
    GAD3R
    2021-11-11T13:50:22+08:002021-11-11T13:50:22+08:00

    您可以使用:

    curl wttr.in/Pune?format=j1 | jq '.current_condition[].localObsDateTime'
    
    • 2
  3. they
    2021-11-12T00:10:22+08:002021-11-12T00:10:22+08:00

    如果您不知道localObsDateTime密钥在 JSON 文档中的确切位置,则必须递归搜索它。您可以这样做,然后使用以下jq表达式提取其值:

    .. | select(type == "object" and has("localObsDateTime")).localObsDateTime
    

    这实质上是说“对于文档中的每个单独事物,如果它是一个对象并且有一个名为 的键localObsDateTime,则提取该键的值”。

    您也可以将其缩短为

    .. | .localObsDateTime? // empty
    

    它说“对于文档中的每个单独的东西,尝试提取localObsDateTime值,如果它存在,如果它不存在或它的值为null,则什么都不给我”。

    你会这样运行:

    $ curl -s 'http://wttr.in/Pune?format=j2' |
        jq -r '.. | select(type == "object" and has("localObsDateTime")).localObsDateTime'
    2021-11-17 12:16 AM
    

    或者,

    $ curl -s 'http://wttr.in/Pune?format=j2' |
        jq -r '.. | .localObsDateTime? // empty'
    2021-11-17 12:16 AM
    

    使实用程序返回解码的文本字符串而不是 JSON 字符串的-r选项。jq

    请注意,上面返回所有 localObsDateTime键的值。您是否只想要其中的第一个,请改用以下jq表达式:

    [ .. | select(type == "object" and has("localObsDateTime")).localObsDateTime ][0]
    

    或者,

    [ .. | .localObsDateTime? // empty ][0]
    

    这将创建一个包含所有值的数组,然后提取第一个。

    请注意,在 URL 中使用j2代替j1会导致回复中的 JSON 文档更小。

    • 1

相关问题

  • 命令 ls | grep 只显示目录(当它也应该显示文件时)

  • grep 什么时候计数,什么时候不计数

  • grep --line-buffered 直到 X 行?

  • jq 打印子对象中所有的键和值

  • jq 使用多个 --arg 添加或更新一个值

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve