cómo imprimir solo las líneas de propiedades del archivo json
ejemplo de archivo 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"
}
}
]
Rendimiento esperado
"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"
Respuestas:
Jq
es la herramienta adecuada para procesar datos JSON:La salida:
En caso de que sea realmente obligatorio obtener cada clave y valor entre comillas dobles, use la siguiente modificación:
La salida:
fuente
jq
) en lugar de operaciones de cadena ingenuas, lo cual es bueno, pero luego usa una operación de cadena ingenua para hacer un procesamiento de secuencia de escape (limitado) para la salida. Eso no me parece una buena idea.jq
debe tener una manera de escapar correctamente del valor de salida, ¿verdad?jq
tiene algunas formas de escapar adecuadamente del valor de salida (como@text
,@sh
etc.), eso no ayudará en este caso particular.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Por favor, no se acostumbre a analizar datos estructurados con herramientas no estructuradas. Si está analizando XML, JSON, YAML, etc., use un analizador específico, al menos para convertir los datos estructurados en una forma más apropiada para AWK
sed
,grep
etc.En este caso,
gron
sería de gran ayuda:(Puede postprocesar esto
| cut -d. -f4- | gron --ungron
para obtener algo muy cercano a la salida deseada, aunque todavía sea un JSON válido).jq
También es apropiado .fuente
De Sed - Introducción y tutorial de Bruce Barnett :
Para una coincidencia más exacta y también para encargarse de cerrar las líneas de paréntesis con espacios en blanco adicionales, puede usar
fuente
/}/
sea más seguro que/}$
. Este último parece no tener ninguna ventaja de todos modos.content
línea que contiene un}
lugar.gron
ojq
es el mejor enfoque.sed
un trazador de líneas. Imprima líneas entre la expresión regularproperties
(es decir, la línea que contiene "propiedades") y la expresión regular^ *}
(es decir, la línea que comienza con cero o más espacios seguidos de "}" y el final de la línea).awk
un trazador de líneas.fuente
//!p
significa Imprimir si no una de las cosas que coinciden?//
repite la última expresión regular,!
no,p
imprimir. Bonito.Está etiquetado
perl
, yperl
todavía no veo respuesta, así que lo incluiré.No use expresiones regulares u otros analizadores 'no estructurados'.
perl
tiene elJSON
módulo con él. (tambiénJSON::PP
forma parte del núcleo desde 5.14)Naturalmente, leería
STDIN
o un nombre de archivo en lugar deDATA
en su escenario de uso real.fuente