首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用shell脚本解析hocon文件

使用shell脚本解析hocon文件
EN

Stack Overflow用户
提问于 2016-03-07 14:50:11
回答 2查看 1.9K关注 0票数 3

我有一个从JSON文件创建的hocon配置。我需要解析下面的hocon并提取值

示例hocon文件: sample.json

代码语言:javascript
复制
    nodes=[
    {
        host=myhostname
        name=myhostname
        ports {
            # debug port
            debug=9384
            # http Port on which app running
            http=9380
            # https Port on which app running
            https=9381
            # JMX port
            jmx=9383
        }
        type=app
        vm-args=[
            "-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintClassHistogram",
            "-XX:+UseConcMarkSweepGC -XX:+UseParNewGC ",
            "-XX:+UseTLAB -XX:CMSInitiatingOccupancyFraction=80 -XX:+ExplicitGCInvokesConcurrent -verbose:gc",
            "-XX:SurvivorRatio=8 -XX:+UseNUMA -XX:TargetSurvivorRatio=80 -XX:MaxTenuringThreshold=15",
            "-Xmx3200m -Xms3200m -XX:NewSize=1664m -XX:MaxNewSize=1664m -Xss1024k",
            "-server"
        ]
    }
]
profile=java-dev
resources {
cfg-repository {
    branch-name=master
    commit-id=HEAD
    password=sigma123
    url="http://localhost:9890/gitcontainer/demo-cfg"
    username=sadmin
}
databases=[
    {
        connection-string="oracle03:1522:si12c"
        name=cm
        password=coresmp601
        username=coresmp601cm
    },
    {
        connection-string="oracle03:1522:si12c"
        name=am
        password=coresmp601
        username=coresmp601am
    }
]
idp {
    url="https://sohanb:8097/idp"
}
keystores=[
    {
        file-location="/home/smp/runtime/ssl"
        name=identity
        passphrase=kspass
    }
]
admin {
    password=sigma123
    url="http://punws-sohanb.net:9002/"
    username=sadmin
}
}

现在从这个hocon文件中提取vm。我尝试过不同的bash工具和sed/awk命令,但没有成功。

请给我建议!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-07 14:59:38

awk去营救!

代码语言:javascript
复制
 $ awk 'p&&$0~/"/{gsub("\"","");print} /vm-args/{p=1} ' hoconfile

            -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintClassHistogram,
            -XX:+UseConcMarkSweepGC -XX:+UseParNewGC ,
            -XX:+UseTLAB -XX:CMSInitiatingOccupancyFraction=80 -XX:+ExplicitGCInvokesConcurrent -verbose:gc,
            -XX:SurvivorRatio=8 -XX:+UseNUMA -XX:TargetSurvivorRatio=80 -XX:MaxTenuringThreshold=15,
            -Xmx3200m -Xms3200m -XX:NewSize=1664m -XX:MaxNewSize=1664m -Xss1024k,
            -server

从那里,您可以按需要格式化。

根据更新后的输入文件,您需要通过附加逻辑终止打印,在两个块之间添加/]/{p=0},如下所示:

代码语言:javascript
复制
$ awk 'p&&$0~/"/{gsub("\"","");print} /]/{p=0} /vm-args/{p=1}' file

您可以将输出输送到tr -d ',' | tr -s ' '以删除逗号和压缩空格,也可以在awk脚本中这样做。

解释:与“vm”的模式匹配设置标志(p=1)。如果设置了标志,并且行包含引号,则打印行,如果行匹配到关闭方括号(]设置标志(p=0),那么如果文件中没有更多的“vm”匹配,则有效地停止。

更新:我稍微修改了代码,现在将行连接成一行,搜索主机名,修剪额外的字符,用tr和sed完成。

代码语言:javascript
复制
$ awk 'p && $0~/"/ {args=args $0 FS} 
       p && $0~/]/ {print args; exit} 
 /name=myhostname/ {h=1} 
    h && /vm-args/ {p=1}' file | 
 tr -d '",' | 
 tr -s ' ' | 
 sed 's/^ //'

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintClassHistogram -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseTLAB -XX:CMSInitiatingOccupancyFraction=80 -XX:+ExplicitGCInvokesConcurrent -verbose:gc -XX:SurvivorRatio=8 -XX:+UseNUMA -XX:TargetSurvivorRatio=80 -XX:MaxTenuringThreshold=15 -Xmx3200m -Xms3200m -XX:NewSize=1664m -XX:MaxNewSize=1664m -Xss1024k -server
票数 4
EN

Stack Overflow用户

发布于 2020-10-10 17:21:25

HOCON看起来像JSON,但它是一只穿羊服的狼。实际上,HOCON配置语法非常复杂,可以包含多个文件、多次替换变量、合并变量、使用环境变量等。

对于这个特定的文件,您可以使用awk/shell脚本获得所需的东西,但是,如果文件变得更复杂,或者,如果将来需要解析更复杂的文件,那么使用专门分析Hocon语法的工具会更好。幸运的是,这种工具是存在的。

使用此工具:Hocon Config打印机

这个工具完全解析了Hocon语法并输出了一个常规的JSON。

对于特定的示例,可以使用:

代码语言:javascript
复制
hocon-config-printer sample.hocon.conf  | jq  '.nodes[0]."vm-args"'

输出:

代码语言:javascript
复制
[
  "-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintClassHistogram",
  "-XX:+UseConcMarkSweepGC -XX:+UseParNewGC ",
  "-XX:+UseTLAB -XX:CMSInitiatingOccupancyFraction=80 -XX:+ExplicitGCInvokesConcurrent -verbose:gc",
  "-XX:SurvivorRatio=8 -XX:+UseNUMA -XX:TargetSurvivorRatio=80 -XX:MaxTenuringThreshold=15",
  "-Xmx3200m -Xms3200m -XX:NewSize=1664m -XX:MaxNewSize=1664m -Xss1024k",
  "-server"
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35846708

复制
相关文章

相似问题

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