【问题标题】:Reading JSON from argument [duplicate]从参数中读取 JSON [重复]
【发布时间】:2019-07-16 20:30:20
【问题描述】:

以下是将 JSON 检索到变量中的命令:

$ JSON=$(curl http://some-url)
$ echo $JSON
{ "a" : "1", "b" : "2", "c" : "3" }
$

需要在 docker 容器上安装jqawk 可用

只能使用jq解析,但是

如何使用jq 方法和awk 方法读取“a”和“b”的值?

【问题讨论】:

  • 如果你需要一个已经安装在你服务器上的工具,而不是awk,考虑python;与 awk 不同,Python 附带了一个符合标准的 JSON 解析器。我们已经在知识库中有问答条目,展示了如何从 bash 调用 Python 来提取 JSON 值。
  • { IFS= read -r -d '' a && IFS= read -r -d '' b && IFS= read -r -d '' c; } < <(python -c $'import sys, json\njson_in = json.load(sys.stdin)\nfor key in sys.argv[1:]:\n\tsys.stdout.write(str(json_in.get(key)))\n\tsys.stdout.write("\\0")' a b c <<<'{"a": 1, "b": 2, "c": 3}'); declare -p a b c,作为为此使用 Python 的示例(即使您的值包含空格、换行符或其他令人惊讶的内容,并且仅运行一次 python 也可以正常工作,不不管你想提取多少变量)。
  • @CharlesDuffy 我无法在此命令中捕获LHS 中的值LHS =$(echo "$JSON" | python -c "import sys, json; print json.load(sys.stdin)['a']") 不起作用。 echo "$JSON" 工作正常
  • 这不是我给你的代码。
  • ...除其他问题外,在 = 之前添加一个空格使其不再是分配。但实际上,如果您希望我支持某些内容,请测试我给您的确切代码,而不是其他内容。

标签: bash awk jq


【解决方案1】:

jq 更合适,因为您的数据是 JSON 格式。

要提取值ab,请使用:

JSON=$(curl http://some-url)
echo "$JSON" | jq '.a'
echo "$JSON" | jq '.b'

【讨论】:

  • 我想从 bash 变量中读取它。运行 curl 命令两次并不好。我有 10 个不同的键可以从 JSON 中读取。
  • 我已经修改了答案。
  • 你能帮我处理一下awk吗?因为jq install 可能需要一个进程请求,这需要时间
  • echo $JSON 本质上是错误的——总是引用:echo "$JSON",或者更好的是,printf '%s\n' "$JSON"——参见BashPitfalls #14,以及the POSIX spec for echo 的应用程序部分。
  • @overexchange 使用 awk 将使结果依赖于 JSON 格式(例如,新行的存在和位置、属性的顺序)。为了变得健壮,您必须在 awk 中实现 JSON 解析器,这可能超出了问题的范围。
猜你喜欢
  • 2020-08-15
  • 2017-10-06
  • 2019-09-20
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多