如何用jq解析这个json

如何用jq解析这个json,json,mongodb,bash,jq,Json,Mongodb,Bash,Jq,命令cat mon.json | jq 当我用jq解析它时,我得到了这个错误 分析错误:第1行第493列的数值文字无效 我认为这是因为id:UUID82088a94-16c2-4aa2-92d8-c557e74049a1如果您想在数据中使用jq,首先必须将其转换为JSON或将其呈现为JSON。这可以通过多种方式完成,例如使用mongoexport: mongoexport是一个命令行工具,用于生成存储在MongoDB实例中的数据的JSON或CSV导出 日志文件是BSON格式的,但是jq只解析JS

命令cat mon.json | jq

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

分析错误:第1行第493列的数值文字无效


我认为这是因为id:UUID82088a94-16c2-4aa2-92d8-c557e74049a1

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

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


日志文件是BSON格式的,但是jq只解析JSON,请参阅

显然,您的文件来自db.currentOp,请参阅

为什么要尝试运行shell脚本?您可以在MongoShell脚本中完成这一切,该脚本是JavaScript。可能与此类似:

{ "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 }
db.currentOp().inprog.forEach(function (x) {
   if (x.op == "find" && x.secs_running > 5) {
      db.killOp(x.opid);
   }
})
打印所有命令与此类似:

{ "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 }
db.currentOp().inprog.forEach(function (x) {
   if (x.op == "find" && x.secs_running > 5) {
      db.killOp(x.opid);
   }
})

我想说,是时候学习了。

正如消息所说,这不是有效的JSON。UUID…、BinData…、NumberLong…、等无效。片段BinData0,47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=和NumberLong。。。也不是有效的JSON;此外,您的行号等也不匹配。接下来,请参阅提供JSON的指南。另外,要回答您的实际问题,JSON解析器无法解析非JSON的文本。可能要求提供此数据的任何人或任何人提供正确的输出。在能够使用jq之前,您必须将数据转换为JSON。看看它是如何回答这个问题的?@WernfriedDomscheit认为这是显而易见的。请看更新。是的,我宁愿用javascript或python来做,但我必须用shell脚本来做,这是毫无意义的。仅使用shell脚本调用javascript,即mongo-u username-p password-quiet或使用-eval选项,即mongo-u username-p password-quiet-eval db.currentOp.inprog.mapx=>x.command。将多个命令放入eval选项中没有问题。