将JSON多个值读入Bash变量 - 无法使用任何第三方工具,如jq等

时间:2016-10-03 08:28:42

标签: python json bash perl shell

这已被问了一百万次,我知道有一百万次溶解。但是我受到限制,我无法在这个客户端服务器上安装任何东西,所以我有任何bash可以提出:)

我引用Parsing JSON with Unix tools并使用它来读取数据并拆分成行。

$ cat demo.json
{"rows":[{"name":"server1.domain.com","Access":"Owner","version":"99","Business":"Owner1","Owner2":"Main_Apprve","Owner1":"","Owner2":"","BUS":"Marketing","type":"data","Egroup":["ALPHA","BETA","GAMA","DELTA"],"Ename":["D","U","G","T","V"],"stage":"TEST"}]}

然而,你可以看到它分裂了" Egroup"和其他多个条目分成单行,使其更难一点。

cat demo.json |     sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}>
    "rows":["name":"server1.domain.com"
    "Access":"Owner"
    "version":"99"
    "Business":"Owner1"
    "Owner2":"Main_Apprve"
    "Owner1":""
    "Owner2":""
    "BUS":"Marketing"
    "type":"data"
    "Egroup":["ALPHA"
    "BETA"
    "GAMA"
    "DELTA"]
    "Ename":["D"
    "U"
    "G"
    "T"
    "V"]
    "stage":"TEST"]

我试图捕获数据,以便我可以使用shell脚本列出。您如何建议我捕获每个变量,然后在shell脚本中重复报告?

 grep -Po '"Egroup":.*?[^\\]",' demo.json
"Egroup":["ALPHA",

正如您所看到的,对于包含多个条目的行,这不起作用。

赞赏的想法。 (顺便说一下我对python和perl选项开放,但无需安装任何额外的模块与json一起使用)

3 个答案:

答案 0 :(得分:0)

使用Python很简单。

示例

$ python -c 'import sys, json; print json.load(sys.stdin)["rows"][0]["Egroup"]' <demo.json 
[u'ALPHA', u'BETA', u'GAMA', u'DELTA']

答案 1 :(得分:0)

使用JSON模块的Perl 1-liner:

perl -lane 'use JSON; my $data = decode_json($_); print join( ",", @{ $data->{rows}->[0]->{Egroup} } )' demo.json

<强>输出

ALPHA,BETA,GAMA,DELTA

如果您没有安装JSON,而不是尝试重新发明JSON解析器,则可以复制JSON::PP的源( PP表示Pure Perl )并放入它在你的工作目录中:

/working/demo.json
/working/JSON/PP.pm   # <- put it here

perl -lane -I/working 'use JSON::PP; my $data = decode_json($_); print join( ",", @{ $data->{rows}->[0]->{Egroup} } )' demo.json   

答案 2 :(得分:0)

我认为添加jq解决方案很好,因为它是一个很棒的JSON工具:

<input jq --raw-output '.rows[].Egroup|join(",")'

您可以在此处https://jqplay.org/s/de4X1TUBG4

看到它的运行情况