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

在shell中处理json(如使用curl)时,如何正确地将多个jq语句链接在一起?,json,curl,pipeline,jq,Json,Curl,Pipeline,Jq,我是jq新手,所以如果这不是jq问题或json问题,请为我指出正确的方向。我不确定正确的术语,所以我很难正确地表达这个问题 我使用tocurl来提取一些json,我想过滤出具有特定值的键。以下是一些示例json: { "id": "593f468c81aaa30001960e16", "name": "Name 1", "channels": [ "593f38398481bc00019632e5" ], "geofenceProfileId": null } {

我是jq新手,所以如果这不是jq问题或json问题,请为我指出正确的方向。我不确定正确的术语,所以我很难正确地表达这个问题

我使用tocurl来提取一些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:错误:语法错误,意外标识,应为“;”或“)”(Unix shell引用问题?)位于第1行: .[]|选择(.channels==58b8a25cf9f6e19cf671872f)
jq:1编译错误 %总接收百分比%x平均速度时间电流 数据加载上载总左速度 100 351k 0 351k 0 0 1109k 0--:---:---:---:---1110k

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


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

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

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}

非常感谢你。语句的嵌套很难处理。我花了几个小时试图找出我做错了什么,而这正是我想要的!