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

How to properly chain multiple jq statements together when processing json in the shell such as with curl?

我是 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 行: .[] | select(.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 漂亮地打印了第一条语句的输出,而第二条语句期望它在一个代码块中吗?如果是这样,我如何将它转换回非漂亮的打印格式,或者我如何使用 jq 来 运行 输出上的新过滤器?

基本上我正在尝试解析数百条记录并过滤掉特定频道号或具有特定 geofenceProfileId 的所有记录。

我建议您从以下开始:

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

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

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}