Разобрать файл hocon с помощью сценария оболочки

У меня есть одна конфигурация hocon, созданная из файла JSON. Мне нужно проанализировать следующий hocon и извлечь значения

пример файла hocon: 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
}
}

Теперь из этого файла hocon я хочу извлечь vm-args. Я пробовал разные инструменты bash и команды sed/awk, но безуспешно.

Пожалуйста, предложите!


person Sohan    schedule 07.03.2016    source источник


Ответы (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
person karakfa    schedule 07.03.2016
comment
Теперь выглядит хорошо, команда работает нормально, последнее, чего мне не хватает, это заменить значения, разделенные запятыми, на whilespace. Поскольку это я должен передать как vmargs другому сценарию - person Sohan; 07.03.2016
comment
Я сделал это с помощью простой команды sed. Работает нормально Спасибо! Было бы здорово, если бы вы могли объяснить части вашей команды awk в ответ. - person Sohan; 07.03.2016
comment
Мои узлы представляют собой массив, могу ли я прочитать конкретные vm-аргументы, отсутствующие на name=myhostname Итак, в узлах, если name=myhostname, я получаю только эти vm-args. - person Sohan; 07.03.2016
comment
если вы извлекаете по одному, не слишком усложняя, вы можете добавить еще один флаг, который будет установлен для шаблона /name=myhostname/, и добавить этот флаг. Здесь сложно писать, я обновлю ответ. - person karakfa; 07.03.2016

Используйте этот инструмент: 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"
]
person Vlad Dinulescu    schedule 10.10.2020