提问人:user4948798 提问时间:2/15/2023 最后编辑:user4948798 更新时间:2/15/2023 访问量:388
使用 jq 从 json 输出中提取特定字段
Extract a particular field from json output using jq
问:
我正在使用 bash 脚本从 json 输出中额外使用特定字段。jq
USERNAME=$(echo "$OUTPUT" | jq -r '.[] | .name')
由于它总是失败并出现错误。jq
parse error: Invalid numeric literal at line 1, column 2
我的restapi结果具有以下输出。
[
{
"url": "#/systemadm/groups/uuid-d6e4e05",
"options": {},
"group_id": 313,
"owner": "abc-123-mec",
"owner_id": "ad1337884",
"id": "c258d7b330",
"name": "abc-group"
},
{
"options": {},
"id": "global%3Regmebers",
"name": "Udata-123"
},
{
"url": "#/systemadm/groups/uuid-38943000",
"options": {},
"group_id": 910,
"owner": "framework-abcc",
"owner_id": "78d4472b738bc",
"id": "38943000057a",
"name": "def-group"
},
........................
............................
......................................
那么这个代码的响应得到“名称”有什么问题呢?jq
答:
1赞
knittl
2/15/2023
#1
jq 只能处理有效的 JSON。
如果 的值字面上是 ,那么您可以将其括在大括号中以使其成为有效的 JSON。虽然没有保证;这取决于输入的确切格式。OUTPUT
"id": "c258d7b330","name": "abc-group"
OUTPUT='"id": "c258d7b330",
"name": "abc-group"'
USERNAME="$(printf '%s\n' "{$OUTPUT}" | jq -r '.name')"
printf '%s\n' "$USERNAME"; // abc-group
如果它无法转换为有效的 JSON,也许使用 + 的简单解决方案就足够了?grep
cut
awk
OUTPUT='"id": "c258d7b330",
"name": "abc-group"'
USERNAME="$(printf '%s\n' "$OUTPUT" | grep '^"name":' | cut -d'"' -f4)"
awk:
printf '%s\n' "$OUTPUT" | awk -F'"' '/^"name":/{print $4}'
或者甚至使用 jq 将输入解析为字符串数组,然后过滤出您感兴趣的行:
jq -Rr '(select(startswith("\"name\":")) / "\"")[3]'
所有选项都非常脆弱,我建议将您的输入修复为实际的、有效的 JSON
评论