Как напечатать только строки свойств из файла JSON
пример файла JSON
{
"href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
"items" : [
{
"href" : "http://master02:8080/api/v1/clusters/HDP/configurations?type=kafka-env&tag=version1527250007610",
"tag" : "version1527250007610",
"type" : "kafka-env",
"version" : 8,
"Config" : {
"cluster_name" : "HDP",
"stack_id" : "HDP-2.6"
},
"properties" : {
"content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi",
"is_supported_kafka_ranger" : "true",
"kafka_log_dir" : "/var/log/kafka",
"kafka_pid_dir" : "/var/run/kafka",
"kafka_user" : "kafka",
"kafka_user_nofile_limit" : "128000",
"kafka_user_nproc_limit" : "65536"
}
}
]
ожидаемый результат
"content" : "\n#!/bin/bash\n\n# Set KAFKA specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}\nexport PATH=$PATH:$JAVA_HOME/bin\nexport PID_DIR={{kafka_pid_dir}}\nexport LOG_DIR={{kafka_log_dir}}\nexport KAFKA_KERBEROS_PARAMS={{kafka_kerberos_params}}\nexport JMX_PORT=9997\n# Add kafka sink to classpath and related depenencies\nif [ -e \"/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\" ]; then\n export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n export CLASSPATH=$CLASSPATH:/usr/lib/ambari-metrics-kafka-sink/lib/*\nfi\n\nif [ -f /etc/kafka/conf/kafka-ranger-env.sh ]; then\n. /etc/kafka/conf/kafka-ranger-env.sh\nfi",
"is_supported_kafka_ranger" : "true",
"kafka_log_dir" : "/var/log/kafka",
"kafka_pid_dir" : "/var/run/kafka",
"kafka_user" : "kafka",
"kafka_user_nofile_limit" : "128000",
"kafka_user_nproc_limit" : "65536"
Ответы:
Jq
правильный инструмент для обработки данных JSON:Выход:
В случае, если действительно необходимо получить каждый ключ и значение в двойных кавычках - используйте следующую модификацию:
Выход:
источник
jq
предпочитаете использовать инструмент с поддержкой синтаксиса ( ), а не наивные строковые операции, что хорошо, но затем вы используете наивную строковую операцию для выполнения (ограниченной) обработки escape-последовательности для вывода. Это не кажется хорошей идеей для меня.jq
должен быть способ правильно экранировать значение для вывода, верно?jq
есть некоторые способы правильно экранировать значение для вывода (например@text
, и@sh
т. Д.), Они не помогут в данном конкретном случае.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Пожалуйста, пожалуйста, не занимайтесь анализом структурированных данных неструктурированными инструментами. Если вы разбираете XML, JSON, YAML и т.д., использовать конкретный анализатор, по крайней мере , для преобразования структурированных данных в более подходящую форму для AWK,
sed
, иgrep
т.д.В этом случае
gron
очень поможет:(Вы можете постобработать это с помощью,
| cut -d. -f4- | gron --ungron
чтобы получить что-то очень близкое к желаемому результату, хотя все еще как действительный JSON.)jq
это также подходит .источник
От Седа - Введение и Учебник Брюса Барнетта :
Для более точного соответствия, а также для того, чтобы позаботиться о закрывающих скобках с дополнительными пробелами, вы можете использовать
источник
/}/
, безопаснее, чем/}$
. Последнее, похоже, не имеет никаких преимуществ в любом случае.content
строке, которая содержит}
где-то.gron
илиjq
является лучшим подходом.sed
один лайнер. Вывести строки между регулярным выражениемproperties
(т. Е. Строкой, содержащей «свойства») и регулярным выражением^ *}
(т. Е. Строкой, начинающейся с нуля или более пробелов, за которой следует «}» и конец строки).awk
один лайнер.источник
//!p
значит? Напечатайте, если не одну из вещей, которая соответствует?//
повторяет последнее регулярное выражение,!
неp
печатайте. Отлично.Он помечен
perl
, и яperl
пока не вижу ответа, поэтому я добавлю.Не используйте регулярные выражения или другие неструктурированные парсеры.
perl
имеетJSON
модуль с ним. (JSON::PP
является частью ядра с 5.14 тоже)Естественно, вы будете читать из
STDIN
или имя файла, а неDATA
в вашем реальном сценарии использования.источник