使用 jq 从 json 输出中提取特定字段

Extract a particular field from json output using jq

提问人:user4948798 提问时间:2/15/2023 最后编辑:user4948798 更新时间:2/15/2023 访问量:388

问:

我正在使用 bash 脚本从 json 输出中额外使用特定字段。jq

USERNAME=$(echo "$OUTPUT" | jq -r '.[] | .name')

由于它总是失败并出现错误。jqparse 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

json bash 语法错误 jq

评论

2赞 knittl 2/15/2023
这不是有效的 JSON。jq 只能使用 JSON
0赞 knittl 2/15/2023
请不要完全改变您的问题。现在你的输入实际上是有效的JSON(如果你删除了“,....”part 并关闭数组),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,也许使用 + 的简单解决方案就足够了?grepcutawk

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