Linux jq

jq的仓库地址

jq的仓库地址
https://stedolan.github.io/jq/

jq简介

jq 是一个命令行 JSON 处理器,类似于 sed 或 grep,但专门设计用于处理 JSON 数据。如果是在日常任务中会用到 JSON 的开发人员或系统管理员,那么这是工具箱中必不可少的工具。
与 grep 和 sed 等通用文本处理工具相比,jq 的主要优点是它理解 JSON 的数据结构,允许使用单个表达式创建复杂的查询。

jq的使用

举例来说,假设试图在这个 JSON 文件中查找容器的名称:

  1. {
  2. "apiVersion": "v1",
  3. "kind": "Pod",
  4. "metadata": {
  5. "labels": {
  6. "app": "myapp"
  7. },
  8. "name": "myapp",
  9. "namespace": "project1"
  10. },
  11. "spec": {
  12. "containers": [
  13. {
  14. "command": [
  15. "sleep",
  16. "3000"
  17. ],
  18. "image": "busybox",
  19. "imagePullPolicy": "IfNotPresent",
  20. "name": "busybox"
  21. },
  22. {
  23. "name": "nginx",
  24. "image": "nginx",
  25. "resources": {},
  26. "imagePullPolicy": "IfNotPresent"
  27. }
  28. ],
  29. "restartPolicy": "Never"
  30. }
  31. }

如果直接使用 grep 查找 name,则写法如下:

  1. $ grep name k8s-pod.json
  2. "name": "myapp",
  3. "namespace": "project1"
  4. "name": "busybox"
  5. "name": "nginx",

grep 返回包含单词 name 的所有行。可以向 grep 添加更多选项来限制它,借助一些正则表达式操作来找到容器的名称。如果是使用 jq 获得想要的结果,则可以使用一个表达式来模拟向下导航数据结构,如下所示:

  1. $ jq '.spec.containers[].name' k8s-pod.json
  2. "busybox"
  3. "nginx"

这个命令提供这两个容器的名称。如果只是在查找第二个容器的名称,则可以在表达式中添加数组元素索引:

  1. $ jq '.spec.containers[1].name' k8s-pod.json
  2. "nginx"

因为 jq 知道数据结构,所以即使文件格式稍有变化,它也能提供相同的结果。而只要格式稍有变化,grep 和 sed 就可能提供不同的结果。