【问题标题】:Parsing json with JQ : Where are the comma?用 JQ 解析 json:逗号在哪里?
【发布时间】:2021-01-14 11:09:32
【问题描述】:

我有这种类型的数据:

{
   "cidr" : "X.X.X.X/27",
   "defaultGateway" : "X.X.X.X",
   "full" : false,
   "id" : "X.X.X.X",
   "ipAddressTab" : [
      {
         "alias_domain" : null,
         "alias_name" : null,
         "description" : "This is the network address for X.X.X.X/27",
         "dnr_rr" : null,
         "dns_domain" : null,
         "environnement" : null,
         "fdqn" : null,
         "hostname" : null,
         "ip" : "X.X.X.X",
         "requester" : null,
         "status" : "reserved",
         "type" : "network"
      },
      {
         "alias_domain" : null,
         "alias_name" : null,
         "description" : "This is the default gateway address for X.X.X.X/27",
         "dnr_rr" : null,
         "dns_domain" : null,
         "environnement" : null,
         "fdqn" : null,
         "hostname" : null,
         "ip" : "X.X.X.X",
         "requester" : null,
         "status" : "reserved",
         "type" : "gateway"
      },
      {
         "alias_domain" : "toto.com",
         "alias_name" : "",
         "description" : "this is a test",
         "dns_domain" : "",
         "environnement" : "test",
         "fdqn" : "XXX",
         "hostname" : "XXX",
         "ip" : "X.X.X.X",
         "requester" : "XXX",
         "status" : "allocated",
         "type" : "VM"
      },
      {
         "alias_domain" : "toto.com",
         "alias_name" : "",
         "description" : "this is a test",
         "dns_domain" : "",
         "environnement" : "test",
         "fdqn" : "XXX",
         "hostname" : "XXX",
         "ip" : "X.X.X.X",
         "requester" : "XXX",
         "status" : "allocated",
         "type" : "VM"
      },
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      },
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      },
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      },
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      },
      {
         "alias_domain" : null,
         "alias_name" : null,
         "description" : "This is the broadcast address for X.X.X.X/27",
         "dnr_rr" : null,
         "dns_domain" : null,
         "environnement" : null,
         "fdqn" : null,
         "hostname" : null,
         "ip" : "X.X.X.X",
         "requester" : null,
         "status" : "reserved",
         "type" : "broadcast"
      }
   ]
}

我想提取状态为“保留”的 IP,但不提取网关/网络/广播 IP 的数据:

cat myfile | jq '.ipAddressTab[] | select(.status == "reserved") | select(.type != "network") | select(.type != "gateway") | select(.type != "broadcast")'

输出是:

{
  "ip": "X.X.X.X",
  "status": "reserved"
}
{
  "ip": "X.X.X.X",
  "status": "reserved"
}
{
  "ip": "X.X.X.X",
  "status": "reserved"
}
{
  "ip": "X.X.X.X",
  "status": "reserved"
}

但是每个“IP 部分”之间的逗号在哪里?

在我的文件中,大括号中的每个部分都用逗号分隔:

 {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      }, <=
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      }, <=
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      }, <=
      {
         "ip" : "X.X.X.X",
         "status" : "reserved"
      }, <=

当我用 jq 解析我的文件时,有办法保留它们吗?

谢谢!

【问题讨论】:

  • 没有逗号,因为你得到了 4 个对象。将命令更改为jq '[.ipAddressTab[] | select(.status == "reserved") | select(.type != "network") | select(.type != "gateway") | select(.type != "broadcast")]' myfile 就可以了,但你会得到一个数组

标签: json linux parsing jq


【解决方案1】:

JQ 的输入和输出是 JSON 实体的。这些流中的项目不是逗号分隔的。一些 JQ 过滤器可能会为他们读入的每个实体发出多个实体。一些过滤器可能不会为他们读入的某些实体发出任何实体。

在您的情况下,您的输入是一个对象的流,而您的输出是多个对象的流。这是因为[] 过滤器的每个单个数组输入都会导致输出中所有项目的流。听起来您希望输出由一个 array 对象组成。这里有两种广泛的方法。

1。使用map 而不是[]

cat myfile | jq '.ipAddressTab | map(select(.status == "reserved") | select(.type != "network") | select(.type != "gateway") | select(.type != "broadcast"))'

map 的参数是另一个过滤器。它将应用于数组中的每个项目,并且该过滤器发出的所有实体都将被收集到一个新数组中。

2。使用[ ... ] 将过滤器的结果收集到一个数组中

cat myfile | jq '.ipAddressTab | [ .[] | select(.status == "reserved") | select(.type != "network") | select(.type != "gateway") | select(.type != "broadcast") ]'

似乎将值放在方括号之间只是创建一个包含一个条目的数组,但实际上这种语法的意思是评估括号之间的过滤器,从该过滤器获取整个输出流并制作一个数组离开它。

事实上,map 本身就是这样定义的。但了解这一点很有用,因为它可以让您了解如何以其他方式使用 [ ... ] 来捕获一系列值。

【讨论】:

    猜你喜欢
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多