Bash、管道解析和格式化json(精简)

Bash、管道解析和格式化json(精简),json,linux,macos,bash,unix,Json,Linux,Macos,Bash,Unix,我有一个bash脚本,它输出一个json,如下所示: { "name": "some", "desc": "this is a desc", "env": "this is an env type", "dd": { "one": "rr", "two": "aa" }, "url": "http://someurl", //etc...... } 我想在我的脚本中通过管道发送一个新命令,以返回最终的js

我有一个bash脚本,它输出一个json,如下所示:

 {
    "name": "some",
    "desc": "this is a desc",
    "env": "this is an env type",
    "dd": {
        "one": "rr",
        "two": "aa"
    },
    "url": "http://someurl",
    //etc......
}
我想在我的脚本中通过管道发送一个新命令,以返回最终的json输出,如下所示:

{
    "name": "some",
    "env": "this is an env type",
    "dd": {
        "one": "rr",
        "two": "aa"
    }
}
如何在不安装新工具/lib(如jq等)的情况下实现这一点

有线索吗

如何在不安装新工具/库(如jq等)的情况下实现这一点。。 有线索吗

好吧,打个比方,就像你在问“我怎样才能成为100米短跑的世界冠军,但我没有腿,我不想要假腿”。简单的答案是,你不能,或者如果你这样做了,它将不会是灵活和通用的,足以成为真正有用的

编写shell脚本就像拥有一个工具箱,里面有许多工具,每个工具都被设计用来完成一项任务并将其做好。因此,如果你拒绝使用可能适合你需要的工具,那么你就不能这样做

因此,正确的方法是使用工具,如
jq
,或小型python/ruby/。。。将从json数据中取出密钥的脚本

如何在不安装新工具/库(如jq等)的情况下实现这一点。。 有线索吗

好吧,打个比方,就像你在问“我怎样才能成为100米短跑的世界冠军,但我没有腿,我不想要假腿”。简单的答案是,你不能,或者如果你这样做了,它将不会是灵活和通用的,足以成为真正有用的

编写shell脚本就像拥有一个工具箱,里面有许多工具,每个工具都被设计用来完成一项任务并将其做好。因此,如果你拒绝使用可能适合你需要的工具,那么你就不能这样做


因此,正确的方法是使用工具,如
jq
,或小型python/ruby/。。。脚本,该脚本将从json数据中取出密钥。

我知道您已规定在不使用外部工具的情况下执行此操作,但希望这将改变您的想法:

jq '{ name, env, dd }' file.json
那很容易

快速而肮脏的python脚本也可以工作:

import sys
import json

with open(sys.argv[1]) as file:
    obj = json.load(file)
    print json.dumps({ key: obj[key] for key in ("name", "env", "dd") })

它可以像
pythonscript.py file.json
那样运行。为了改进格式,您可以将额外的参数传递给
json.dumps
()。

我知道您已经规定在不使用外部工具的情况下执行此操作,但希望这会改变您的想法:

jq '{ name, env, dd }' file.json
那很容易

快速而肮脏的python脚本也可以工作:

import sys
import json

with open(sys.argv[1]) as file:
    obj = json.load(file)
    print json.dumps({ key: obj[key] for key in ("name", "env", "dd") })


它可以像
pythonscript.py file.json
那样运行。为了改进格式,您可以将额外的参数传递给
json.dumps
()。

所以基本上只使用bash编写json解析器?以您想要的格式输出json不是更容易吗?不管怎样,你都不应该在json形成后弄乱它。问题是json包含许多我不需要的键,我只是想用一个新命令来缩小它,因为有时候它可能是MB@Marc Bso。。。同样,为什么不首先修复构建json的脚本呢?你不会去杂货店,买整个商店的存货,然后把它运回家,然后到处翻找,扔掉除了你想要的胡萝卜以外的所有东西。
jq
是一个独立的可执行文件,因此它实际上不需要安装。我想说这是适合这项工作的工具。@Marc B因为不是我写的脚本,它是一个外部工具,我实际上无法触摸它,所以基本上只使用bash编写json解析器?以您想要的格式输出json不是更容易吗?不管怎样,你都不应该在json形成后弄乱它。问题是json包含许多我不需要的键,我只是想用一个新命令来缩小它,因为有时候它可能是MB@Marc Bso。。。同样,为什么不首先修复构建json的脚本呢?你不会去杂货店,买整个商店的存货,然后把它运回家,然后到处翻找,扔掉除了你想要的胡萝卜以外的所有东西。
jq
是一个独立的可执行文件,因此它实际上不需要安装。我想说这是适合这份工作的工具。@Marc B因为这不是我写的脚本,它是一个外部工具,我无法触摸它。我在osx Yosemite上,我得到
jq:command not found
我不会安装任何链接到下载页面的东西。我真的认为这是最好的方式。Ofc是最好的,但不是我想要的:(安装,然后你只需要执行
brew安装jq
就可以了。@sbaaang我添加了一个简单的python选项,你可以选择。我在osx Yosemite上,我得到
jq:command not found
我不会安装任何我链接到下载页面的东西。我真的认为这是最好的方式。Ofc是最好的,但不是o。)我正在寻找的ne:(安装,然后你只需要执行
brew安装jq
,你就可以得到它了。@sbaaang我添加了一个简单的python选项,你可以选择。没有腿听起来有很多限制:像
jq
这样的Pno工具听起来也有很多限制:-)EHHEHH,但是,这个脚本必须运行在客户机上,我不能安装新的工具,你会考虑做shell脚本并摆脱<代码> GRP,<代码> SED还是<代码>剪切<代码>?等等,然后带着脚本带上工具,或者在Python中执行它(默认情况下它有一个JSON解析器模块)。没有腿听起来有很多限制:像
jq
这样的Pno工具听起来也有很多限制:-)EHHEHH,但是,这个脚本必须运行在客户机上,我不能安装新的工具,你会考虑做shell脚本并摆脱<代码> GRP,<代码> SED还是<代码>剪切<代码>?等等,然后带着脚本带上工具,或者在Python中执行它(默认情况下它有一个JSON解析器模块)。