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

bvpmtnay  于 2022-11-13  发布在  Shell
关注(0)|答案(2)|浏览(162)

我是jq的新手,所以如果这不是jq问题或json问题,请给我指出正确的方向。我不确定正确的术语,所以它使我很难正确地表达问题。
我使用to 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:error:语法错误,意外的IDENT,应为“;'或')'(Unix shell引用问题?),位于第1行:.[]|选择(.通道==
jq:1编译错误%总计%已接收% Xferd平均速度时间时间时间当前卸载上载总计已用左侧速度100 351 k 0 351 k 0 0 1109 k 0 --:---:-----:-----:---------1110 k
这个错误是因为jq pretty打印了第一个语句的输出,而第二个语句希望它在一个代码块中吗?如果是这样,我该如何将它转换回非pretty打印格式,或者我该如何使用jq对输出运行一个新的过滤器?
基本上,我正在尝试解析数百条记录,并筛选出特定频道号中或具有特定geofenceProfileId的所有记录。

bzzcjhmw

bzzcjhmw1#

我建议你从以下内容开始:

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

实际上,这可能正是您想要的过滤器。如果您想在选择后删除“频道”,您可以按如下方式增加上面的过滤器:

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}
pokxtpni

pokxtpni2#

可能和你的案子无关但我成功地把我的指挥部

npm pkg get version -ws | jq "select(to_entries | min_by(.value) | .value)"

npm pkg get version -ws | jq "to_entries | min_by(.value) | .value"

结果是一样的。也许这会有帮助。所以我们的想法是在jq语句中使用管道

相关问题