在shell中处理json(如使用curl)时,如何正确地将多个jq语句链接在一起?
我是jq新手,所以如果这不是jq问题或json问题,请为我指出正确的方向。我不确定正确的术语,所以我很难正确地表达这个问题 我使用tocurl来提取一些json,我想过滤出具有特定值的键。以下是一些示例json:在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 } {
{
"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}
非常感谢你。语句的嵌套很难处理。我花了几个小时试图找出我做错了什么,而这正是我想要的!