2016-03-07 131 views
0

我有一个从JSON文件创建的hocon配置。我需要分析以下hocon和提取值使用shell脚本解析hocon文件

样本hocon文件:从这个hocon文件我想提取的VM-ARGS sample.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 
} 
} 

现在。 我已经尝试了不同的bash工具和sed/awk命令,但没有运气。

请建议!

回答

1

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}作为更新的输入文件

UPDATE :

$ 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 
+0

我刚刚编辑了hocon文件,输出现在很糟糕。 – Sohan

+0

现在看起来不错,命令工作正常,最后一件事是我缺少的是用whilespace替换逗号分隔值。因为这我必须作为vmargs传递给其他脚本 – Sohan

+0

我做了简单的sed命令的工作。正常工作谢谢!如果你可以在awk命令的部分内容中找到答案,那将会很棒。 – Sohan