首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JSON.sh从shell脚本中解析JSON

使用JSON.sh从shell脚本中解析JSON
EN

Stack Overflow用户
提问于 2016-04-25 19:49:17
回答 1查看 2K关注 0票数 1

我正在使用JSON.sh解析JSON数据。我想从json文件(test.json)中读取数据,其内容如下:

代码语言:javascript
复制
{
  "/home/ukrishnan/projects/test.yml": {
    "LOG_DRIVER": "syslog",
    "IMAGE": "mysql:5.6"
  },
  "/home/ukrishnan/projects/mysql/app.xml": {
    "ENV_ACCOUNT_BRIDGE_ENDPOINT": "/u01/src/test/sample.txt"
  }
}

我试着用JSON.sh解析这个JSON,

代码语言:javascript
复制
test_parser=`sh ./lib/JSON.sh < test/test.json`
echo $test_parser

它打印出来,

代码语言:javascript
复制
["/home/ukrishnan/projects/test.yml","LOG_DRIVER"] "syslog" ["/home/ukrishnan/projects/test.yml","IMAGE"] "mysql:5.6" ["/home/ukrishnan/projects/test.yml"] {"LOG_DRIVER":"syslog","IMAGE":"mysql:5.6"} ["/home/ukrishnan/projects/mysql/app.xml","ENV_ACCOUNT_BRIDGE_ENDPOINT"] "/u01/src/test/sample.txt" ["/home/ukrishnan/projects/mysql/app.xml"] {"ENV_ACCOUNT_BRIDGE_ENDPOINT":"/u01/src/test/sample.txt"} [] {"/home/ukrishnan/projects/test.yml":{"LOG_DRIVER":"syslog","IMAGE":"mysql:5.6"},"/home/ukrishnan/projects/mysql/app.xml":{"ENV_ACCOUNT_BRIDGE_ENDPOINT":"/u01/src/test/sample.txt"}}

然而,同样的命令(sh ./lib/JSON.sh < test/test.json),如果我在终端上运行,它是用换行符打印的,

代码语言:javascript
复制
["/home/ukrishnan/projects/test.yml","LOG_DRIVER"]  "syslog"
["/home/ukrishnan/projects/test.yml","IMAGE"]   "mysql:5.6"
["/home/ukrishnan/projects/test.yml"]   {"LOG_DRIVER":"syslog","IMAGE":"mysql:5.6"}
["/home/ukrishnan/projects/mysql/app.xml","ENV_ACCOUNT_BRIDGE_ENDPOINT"]    "/u01/src/test/sample.txt"
["/home/ukrishnan/projects/mysql/app.xml"]  {"ENV_ACCOUNT_BRIDGE_ENDPOINT":"/u01/src/test/sample.txt"}
[]  {"/home/ukrishnan/projects/test.yml":{"LOG_DRIVER":"syslog","IMAGE":"mysql:5.6"},"/home/ukrishnan/projects/mysql/app.xml":{"ENV_ACCOUNT_BRIDGE_ENDPOINT":"/u01/src/test/sample.txt"}}

我想读取它并将其赋值给bash变量,例如,

代码语言:javascript
复制
file_name='/home/ukrishnan/projects/test.yml'
key='LOG_DRIVER'
value='syslog'

因为我几乎完全不熟悉shell脚本和grep或awk,所以我不太了解如何实现这一点。在这方面的任何帮助都将非常感谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 03:47:19

我写了一个JSON serializer / deserializer for gawk,如果你感兴趣的话。保存该脚本并对其进行修改,将# === FUNCTIONS ===上的所有内容替换为以下内容:

代码语言:javascript
复制
#!/usr/bin/gawk -f

# capture JSON string from beginning to end into a scalar variable
{ json = json ORS $0 }

END {
    # objectify JSON string to the multilevel array "obj"
    deserialize(json, obj)

    for (filename in obj) {

        print "file_name=" quote(filename)

        for (key in obj[filename]) {

            # print key="value"
            print key "=" quote(obj[filename][key])
        }
    }
}

执行chmod 755 json.awk并执行它。输出将如下所示:

代码语言:javascript
复制
$ ./json.awk test5.json
file_name="/home/ukrishnan/projects/mysql/app.xml"
ENV_ACCOUNT_BRIDGE_ENDPOINT="/u01/src/test/sample.txt"
file_name="/home/ukrishnan/projects/test.yml"
LOG_DRIVER="syslog"
IMAGE="mysql:5.6"

希望逻辑是相当容易遵循的。如果您希望在每次循环迭代时输出filename=key=value=,请相应地修改嵌套的for循环:

代码语言:javascript
复制
for (filename in obj) {
    for (key in obj[filename]) {
        print "file_name=" quote(filename)
        print "key=" quote(key)
        print "value=" quote(obj[filename][key])
    }
}

该更改将导致以下输出:

代码语言:javascript
复制
$ ./json.awk test5.json
file_name="/home/ukrishnan/projects/mysql/app.xml"
key="ENV_ACCOUNT_BRIDGE_ENDPOINT"
value="/u01/src/test/sample.txt"
file_name="/home/ukrishnan/projects/test.yml"
key="LOG_DRIVER"
value="syslog"
file_name="/home/ukrishnan/projects/test.yml"
key="IMAGE"
value="mysql:5.6"

无论如何,有了这个输出,您可以在BASH中做一些愚蠢的事情来填充变量并对其执行操作:

代码语言:javascript
复制
#!/bin/bash

./test.awk test5.json | while read -r line; do {
    eval $line
    [ "${line/=*/}" = "value" ] && {
        echo "bash: file_name=$file_name"
        echo "bash: key=$key"
        echo "bash: value=$value"
        echo "------"
    }
}; done

不过,如果从头到尾都在gawk中完成所有处理,而不是搞乱多国语言的移交,可能会更优雅。

回到json.awk,如果您更喜欢将json.awk模块化以便于在将来的项目中重用,您可以删除# === FUNCTIONS ===上面的所有内容,创建一个包含此答案顶部的代码块的单独main.awk,并将@include "json.awk"作为END {...}之外的几乎任何地方(例如,就在shbang之下)的帮助库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36839706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档