【问题标题】:Parse hocon file using shell script使用 shell 脚本解析 hocon 文件
【发布时间】:2016-06-21 04:16:59
【问题描述】:

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

示例 hocon 文件: 示例.json

    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-args。 我尝试了不同的 bash 工具和 sed/awk 命令,但没有运气。

请推荐!

【问题讨论】:

    标签: shell awk command-line sed hocon


    【解决方案1】:

    使用此工具:Hocon Config Printer

    对于您的具体示例,您可以使用:

    hocon-config-printer sample.hocon.conf  | jq  '.nodes[0]."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"
    ]
    

    【讨论】:

      【解决方案2】:

      awk 来救援!

       $ 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},如下所示:

      $ awk 'p&&$0~/"/{gsub("\"","");print} /]/{p=0} /vm-args/{p=1}' file
      

      您可以将输出通过管道传输到 tr -d ',' | tr -s ' ' 以删除逗号和压缩空格,或者在 awk 脚本中执行相同操作。

      说明:与“vm-args”的模式匹配设置标志 (p=1)。如果设置了标志并且该行包含引号打印该行,如果该行匹配到右方括号 (]) 将标志设置为关闭 (p=0),因此如果没有更多的“vm-args”匹配有效地停止文件。

      更新:我稍微改变了代码,现在将这些行连接成一个,搜索主机名,修剪多余的字符是用 tr 和 sed 完成的。

      $ 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
      

      【讨论】:

      • 现在看起来不错,命令工作正常,最后我缺少的是用 whilespace 替换逗号分隔的值。因为这我必须作为 vmargs 传递给其他脚本
      • 我通过简单的 sed 命令实现了这一点。工作正常谢谢!如果您能在回答中解释您的 awk 命令的各个部分,那就太好了。
      • 我的节点是一种数组,我可以读取 name=myhostname 上的特定 vm-args 所以在节点中如果 name=myhostname 然后我只得到那个 vm-args。
      • 如果您一次提取一个,而不会太复杂,您可以添加另一个标志,该标志将为模式/name=myhostname/ 设置并添加该标志。这里很难写,我会更新答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2022-11-30
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多