今天我要第一次和jq一起工作了。我试过用任何一种肮脏的方法来使这件事成功。我们开始谈正事吧:
我正试图为一些用例进一步开发用于Unifi控制器的相当简单的API:https://dl.ui.com/unifi/6.0.41/unifi_sh_api
下面是一些模拟数据(真正的json数据是数千行):
{
"meta": {
"rc": "ok"
},
"data": [
{
"_id": "61a0da77f730e404af0edc3c",
"ip": "10.19.31.120",
"mac": "ff:ec:ff:89:ff:58",
"name": "Test-Accesspoint"
}
]
}这是我的advancedapi.sh
#!/bin/bash
source unifiapi.sh
unifi_login 1>dev/null
if [ "$1" ];
then
command=$1
shift
else
echo "Please enter command"
exit
fi
#jq -r '.data[] | "\(.name),\(.mac)"'
assembleKeys(){
c="0"
seperator=";"
keys=$(for i in "$@"
do
c=$(expr $c + 1)
if [ $c -gt 1 ];
then
echo -n "${seperator}\(.${i})"
else
echo -n "\(.${i})"
fi
done
echo)
}
assembleJQ(){
c=0
jq=$(echo -en 'jq -r -j \x27.data[] | '
for i in "$@"
do
if [ "$c" != "0" ];
then
echo -en ",\x22 \x22,"
fi
c=1
echo -en ".$i"
done
echo -en ",\x22\\\n\x22\x27")
echo "$jq"
}
getDeviceKeys(){
assembleJQ "$@"
#unifi_list_devices | jq -r '.data[]' | jq -r "${keys}"
#export keys=mac
#export second=name
#unifi_list_devices | jq -r -j --arg KEYS "$keys" --arg SECOND "$second" '.data[] | .[$KEYS]," ",.[$SECOND],"\n"'
unifi_list_devices | $jq
#unifi_list_devices | jq -r -j '.data[] | .mac," ",.name,"\n"'
}
"$command" $@用户应该能够用他们想要的多少参数从API调用任何函数。所以基本上这个:
#export keys=mac
#export second=name
#unifi_list_devices | jq -r -j --arg KEYS "$keys" --arg SECOND "$second" '.data[] | .[$KEYS]," ",.[$SECOND],"\n"'这是可行的,但只有有限的几个参数。我想把$@传给jq。
我试图通过呼叫获取设备的名称和mac地址:
./advancedapi.sh getDeviceKeys mac name这应该返回设备的mac地址和名称。但它只给了我这个:
jq -r -j '.data[] | .mac," ",.name,"\n"'
jq: error: syntax error, unexpected INVALID_CHARACTER, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
'.data[]
jq: 1 compile error最上面的行是jq命令,它在手动调用时工作得非常好。
assembleKeys函数是我试图生成如下所示的字符串:
jq -r '.data[] | "\(.name),\(.mac)"'谁能给我解释一下,最好是深入一点,怎么做?我快疯了!
谢谢!
发布于 2022-03-09 20:04:03
我想把$@传给jq。
实际上有很多方法可以做到这一点,但最简单的方法可能是使用--args命令行选项,如下所示:
档案:检查
#/bin/bash
echo "${@}"
jq -n '$ARGS.positional' --args "${@}" 示例运行:
./check 1 2 3
1 2 3
[
"1",
"2",
"3"
]投影
这里有一个例子,可能更接近你要找的东西。使用示例JSON:
文件: check2
#/bin/bash
jq -r '
def project($array):
. as $in | reduce $array[] as $k ([]; . + [$in[$k]]);
$ARGS.positional,
(.data[] | project($ARGS.positional))
| @csv
' input.json --args "${@}" ./check2 name mac
"name","mac"
"Test-Accesspoint","ff:ec:ff:89:ff:58"发布于 2022-03-09 14:43:09

在json (红色突出显示的逗号)中有错误(不需要逗号)
$
$ cat j.json | jq -r '.data[] | "\(.name)█\(.mac)█\(.ip)█\(._id)"'
Test-Accesspoint█ff:ec:ff:89:ff:58█10.19.31.120█61a0da77f730e404af0edc3c
$ cat j.json
{
"meta": {
"rc": "ok"
},
"data": [
{
"_id": "61a0da77f730e404af0edc3c",
"ip": "10.19.31.120",
"mac": "ff:ec:ff:89:ff:58",
"name": "Test-Accesspoint"
}
]
}
$如果api给出了这个json,那么在将它导入jq (可能是用sed或类似的东西)之前,您可能应该编辑它。
https://stackoverflow.com/questions/71410229
复制相似问题