使用jq在BASH中处理JSON


文档摘要

使用 jq 在 BASH 中处理 JSON 命令行工具 是一款轻量级且灵活的 JSON 处理工具。它非常适合在 BASH 中解析 JSON 输出。 的一大优点是:它使用可移植的 C 语言编写,且没有任何运行时依赖。你只需下载一个单独的二进制文件,或者使用 apt 等包管理器,通过一条命令即可完成安装。 脚本规划 在本教程的演示中,我将使用一个返回简单 JSON 输出的外部 REST API,名为 QuizAPI: https://quizapi.io/ 如果你想跟着一起操作,请务必在此处获取一个免费的 API 密钥: https://quizapi.io/clientarea/settings/token QuizAPI 对开发者是免费的。 安装 jq 在你的系统上安装 的方式有很多。

使用 jq 在 BASH 中处理 JSON

命令行工具 jq 是一款轻量级且灵活的 JSON 处理工具。它非常适合在 BASH 中解析 JSON 输出。

jq 的一大优点是:它使用可移植的 C 语言编写,且没有任何运行时依赖。你只需下载一个单独的二进制文件,或者使用 apt 等包管理器,通过一条命令即可完成安装。

脚本规划

在本教程的演示中,我将使用一个返回简单 JSON 输出的外部 REST API,名为 QuizAPI

https://quizapi.io/

如果你想跟着一起操作,请务必在此处获取一个免费的 API 密钥:

https://quizapi.io/clientarea/settings/token

QuizAPI 对开发者是免费的。

安装 jq

在你的系统上安装 jq 的方式有很多。最简单的方法之一是根据你的操作系统使用包管理器。

以下是针对不同操作系统所需的命令列表:

  • 在 Ubuntu/Debian 上安装 jq:
sudo apt-get install jq
  • 在 Fedora 上安装 jq:
sudo dnf install jq
  • 在 openSUSE 上安装 jq:
sudo zypper install jq
  • 在 Arch 上安装 jq:
sudo pacman -S jq
  • 在 Mac 上使用 Homebrew 安装:
brew install jq
  • 在 Mac 上使用 MacPort 安装:
port install jq

如果你使用的是其他操作系统,建议查看官方文档以获取更多信息:

https://jqlang.org/download/

安装 jq 后,你可以通过以下命令检查当前版本:

jq --version

使用 jq 解析 JSON

在安装了 jq 并获取 QuizAPI API 密钥后,你就可以直接在终端中解析 QuizAPI 的 JSON 输出。

首先,创建一个存储 API 密钥的变量:

API_KEY=YOUR_API_KEY_HERE

要从 QuizAPI 的某个端点获取输出,可以使用 curl 命令:

curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10"

若需更具体的输出,可以使用 QuizAPI 的 URL 生成器:

https://quizapi.io/api-config

运行 curl 命令后,你将得到如下原始 JSON 输出:

Raw Json output

这样的输出可能不太容易阅读,但借助 jq 命令行工具,我们只需将 curl 命令的输出通过管道传递给 jq,就能得到格式化良好的 JSON 输出:

curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq

注意末尾的 | jq

在这种情况下,你将得到如下格式化的输出:

bash jq formatting

现在看起来清晰多了!jq 命令行工具不仅为我们格式化了输出,还添加了漂亮的颜色高亮!

使用 jq 获取第一个元素

假设我们只想获取 JSON 输出中的第一个元素,只需使用以下语法指定要查看的索引:

jq .[0]

现在,如果我们再次运行 curl 命令,并将输出通过管道传递给 jq .[0],如下所示:

curl "https://quizapi.io/api/v1/questions?apiKey=${API_KEY}&limit=10" | jq.[0]

你将只获得第一个元素,输出如下所示:

jq get first element only

仅获取特定键的值

有时你可能只想获取特定键的值。例如,在我们的示例中,QuizAPI 返回一个问题列表,包含答案、描述等信息。但如果你只想获取问题本身,而不需要其他信息呢?

使用 jq 实现这一点非常简单,你只需在 jq 命令后添加键名,如下所示:

jq .[].question

我们添加了 .[] as the QuizAPI returns an array and by specifying .[],这告诉 jq 我们希望获取数组中所有元素的 .question 值。

你将得到如下输出:

jq get a value only for specific key

如你所见,我们现在只获取了问题,而没有其他值。

在 BASH 脚本中使用 jq

接下来,我们创建一个小型 BASH 脚本,用于输出以下信息:

  • 仅获取输出中的第一个问题
  • 获取该问题的所有答案
  • 将答案分配给变量
  • 打印问题和答案
  • 为此,我编写了如下脚本:

{notice} 请务必将 API_KEY 部分替换为你实际的 QuizAPI 密钥:

#!/bin/bash ## # Make an API call to QuizAPI and store the output in a variable ## output=$(curl 'https://quizapi.io/api/v1/questions?apiKey=API_KEY&limit=10' 2>/dev/null) ## # Get only the first question ## output=$(echo $output | jq .[0]) ## # Get the question ## question=$(echo $output | jq .question) ## # Get the answers ## answer_a=$(echo $output | jq .answers.answer_a) answer_b=$(echo $output | jq .answers.answer_b) answer_c=$(echo $output | jq .answers.answer_c) answer_d=$(echo $output | jq .answers.answer_d) ## # Output the question ## echo " Question: ${question} A) ${answer_a} B) ${answer_b} C) ${answer_c} D) ${answer_d} "

运行脚本后,你将得到如下输出:

Using jq in a bash script

我们还可以进一步改进,使脚本更具交互性,让你可以直接在终端中选择答案。

已经有一个使用 QuizAPI 和 jq 的 BASH 脚本实现了这一功能:

你可以在此处查看该脚本:

结论

命令行工具 jq 是一款功能强大的工具,它让你可以直接在 BASH 终端中处理 JSON。

通过这种方式,你可以轻松地使用 BASH 与各种不同的 REST API 进行交互。

如需了解更多信息,可以查看官方文档:

有关 QuizAPI 的更多信息,可以查看其官方文档:

{notice} 本内容最初发布于 DevDojo.com

免责声明
本文件由基于人工智能的机器翻译服务翻译而成。尽管我们力求翻译准确,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言版本的文件为准,作为权威依据。对于关键信息,建议采用专业人工翻译。对于因使用本翻译而产生的任何误解或误读,我们概不负责。


发布者: 作者: 转发
评论区 (0)
U