【问题标题】:How to parse this json with jq [closed]如何用 jq 解析这个 json [关闭]
【发布时间】:2021-06-13 10:01:40
【问题描述】:
{ "inprog" : [ { "host" : "DESKTOP-LTB3QQ5:27017", "desc" : "conn25", "connectionId" : 25, "client" : "127.0.0.1:38354", "appName" : "MongoDB Shell", "clientMetadata" : { "application" : { "name" : "MongoDB Shell" }, "driver" : { "name" : "MongoDB Internal Client", "version" : "3.6.8" }, "os" : { "type" : "Linux", "name" : "Ubuntu", "architecture" : "x86_64", "version" : "20.04" } }, "active" : true, "currentOpTime" : "2021-03-16T11:01:14.599+0530", "opid" : 3135, "lsid" : { "id" : UUID("82088a94-16c2-4aa2-92d8-c557e74049a1"), "uid" : BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=") }, "secs_running" : NumberLong(0), "microsecs_running" : NumberLong(65), "op" : "command", "ns" : "admin.$cmd.aggregate", "command" : { "currentOp" : 1, "lsid" : { "id" : UUID("82088a94-16c2-4aa2-92d8-c557e74049a1") }, "$db" : "admin" }, "numYields" : 0, "locks" : { }, "waitingForLock" : false, "lockStats" : { } } ], "ok" : 1 }

命令cat mon.json | jq

当我用 jq 解析这个时,我得到了这个错误

parse error: Invalid numeric literal at line 1, column 493

我认为这是因为 "id": UUID("82088a94-16c2-4aa2-92d8-c557e74049a1")

【问题讨论】:

  • 如消息所述,这不是有效的 JSON。 UUID(...)BinData(...)NumberLong(...)等无效。
  • 片段BinData(0,"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=")NumberLong(...) 也不是有效的JSON;您的行号等也不匹配。展望未来,请参阅提供minimal reproducible example 的指南。
  • 另外,切线,the cat is useless.
  • 要回答您的实际问题,JSON 解析器无法解析不是 JSON 的文本。可能要求向您提供此数据的任何人或任何其他人提供更正的输出。
  • 您必须先将数据转换为 JSON,然后才能使用 jq。见stackoverflow.com/questions/38144236/…

标签: json mongodb bash jq


【解决方案1】:

如果您想将 jq 用于您的数据,您首先必须将其转换为(或呈现为)JSON。这可以通过多种方式完成,例如使用mongoexport:

mongoexport 是一个命令行工具,可生成存储在 MongoDB 实例中的数据的 JSON 或 CSV 导出。

https://docs.mongodb.com/database-tools/mongoexport/

【讨论】:

  • 它是如何回答问题的?
  • @WernfriedDomscheit 认为这很明显。查看更新。
【解决方案2】:

日志文件为 BSON 格式,但 jq 仅解析 JSON,请参阅 JSON and BSON

显然你的文件来自db.currentOp(),见https://dba.stackexchange.com/questions/287020/save-output-of-a-mongo-command-to-a-variable-bash-script

为什么要尝试运行 shell 脚本?您可以在 mongo shell 脚本(即 JavaScript)中完成所有工作。可能看起来像这样:

db.currentOp().inprog.forEach(function (x) {
   if (x.op == "find" && x.secs_running > 5) {
      db.killOp(x.opid);
   }
})

打印所有命令将与此类似:

db.currentOp().inprog.map(x => x.command)

我想说,是时候学习JavaScript了。

【讨论】:

  • 是的,我宁愿用 javascript 或 python 来做,但我必须用 shell 脚本来做
  • 这真的毫无意义。仅使用 shell 脚本调用 javascript,即mongo -u username -p password --quiet <your_javascript.js> 或使用--eval 选项,即mongo -u username -p password --quiet --eval "db.currentOp().inprog.map(x => x.command)"。将多个命令放入eval选项是没有问题的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多