json - 在 shell 中处理 json 时,如何正确地将多个 jq 语句链接在一起,例如使用 curl?

标签 json curl pipeline jq

我是 jq 的新手,所以如果这不是 jq 问题或 json 问题,请指出正确的方向。我不确定正确的术语,因此很难正确阐明问题。

我正在使用 curl 来提取一些我想过滤掉具有特定值的键的 json。这是一些示例 json:

{
  "id": "593f468c81aaa30001960e16",
  "name": "Name 1",
  "channels": [
    "593f38398481bc00019632e5"
  ],
  "geofenceProfileId": null
}
{
  "id": "58e464585180ac000a748b57",
  "name": "Name 2",
  "channels": [
    "58b480097f04f20007f3cdca",
    "580ea26616de060006000001"
  ],
  "geofenceProfileId": null
}
{
  "id": "58b4d6db7f04f20007f3cdd2",
  "name": "Name 3",
  "channels": [
    "58b8a25cf9f6e19cf671872f"
  ],
  "geofenceProfileId": "57f53018271c810006000001"
}

当我运行以下命令时:

curl -X GET -H 'authorization: Basic somestring=' "https://myserver/myjson" |
  jq '.[] | {id: .id, name: .name, channels: .channels, geofenceProfileId: .geofenceProfileId}' |
  jq '.[] | select(.channels == 58b8a25cf9f6e19cf671872f)'

我收到以下错误:

jq: 错误:语法错误,意外的 IDENT,需要 ';'或 ')'(Unix shell 引用问题?)第 1 行: .[] |选择(.channels == 58b8a25cf9f6e19cf671872f)
jq: 1 编译错误 % Total % Received % Xferd Average Speed Time Time Time 电流 Dload Upload Total Spent Left 速度 100 351k 0 351k 0 0 1109k 0 --:--:-- --:--:-- --:--:-- 1110k

这个错误是因为 jq 漂亮地打印了第一条语句的输出,而第二条语句期望它在一个代码块中吗?如果是这样,我如何将它转换回非 pretty-print 格式,或者我如何使用 jq 对输出运行新的过滤器?

基本上,我试图解析数百条记录并过滤掉特定 channel 号或具有特定 geofenceProfileId 的所有记录。

最佳答案

我建议您从:

jq 'select(.channels | index("58b8a25cf9f6e19cf671872f"))'

事实上,这甚至可能正是您想要的过滤器。如果您想在做出选择后删除“ channel ”,您可以按如下方式增加上面的过滤器:

select(.channels | index("58b8a25cf9f6e19cf671872f")) | del(.channels)

要注意的主要事情是,可以在一次 jq 调用中创建一个管道。所以很可能你最终会得到: curl ... | jq ...

顺带一提

jq 表达式 {"id": .id} 可以缩写为 {id},所以代替:

{id.id, name: .name, channels: .channels, geofenceProfileId: .geofenceProfileId}

你可以这样写:

{id, name, channels, geofenceProfileId}

关于json - 在 shell 中处理 json 时,如何正确地将多个 jq 语句链接在一起,例如使用 curl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47234312/

相关文章:

linux - : `ls -lt | grep - | head -1 | awk ' {print $9 }' | xargs rm` 是什么意思

c - 如何使用 write() 或 fwrite() 将数据写入终端(stdout)?

jquery - 使用 jQuery 通过 .ajax() 传递 JSON

c - 如何在 C 的 curl 中启用 scp?

asp.net-mvc - ASP.NET MVC - 使用 cURL 或类似方法在应用程序中执行请求

c - 在curl_global_init调用上的SIGSEGV

azure - Azure 数据工厂管道登录特定 URL 的技术是什么

java - 如何在数据驱动文档中制作动态 json 并在 jsp 中获取 json 响应

java - 使用 Jackson 解析 JSON。为什么使用 HashMap 而不是我的类型?

json - 在 Swift 中发送带有承载 token 和 json 正文的发布请求