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:
Jqes 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.jqdebe tener una manera de escapar correctamente del valor de salida, ¿verdad?jqtiene algunas formas de escapar adecuadamente del valor de salida (como@text,@shetc.), 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,grepetc.En este caso,
gronsería de gran ayuda:(Puede postprocesar esto
| cut -d. -f4- | gron --ungronpara obtener algo muy cercano a la salida deseada, aunque todavía sea un JSON válido).jqTambié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.contentlínea que contiene un}lugar.gronojqes el mejor enfoque.sedun 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).awkun trazador de líneas.fuente
//!psignifica Imprimir si no una de las cosas que coinciden?//repite la última expresión regular,!no,pimprimir. Bonito.Está etiquetado
perl, yperltodavía no veo respuesta, así que lo incluiré.No use expresiones regulares u otros analizadores 'no estructurados'.
perltiene elJSONmódulo con él. (tambiénJSON::PPforma parte del núcleo desde 5.14)Naturalmente, leería
STDINo un nombre de archivo en lugar deDATAen su escenario de uso real.fuente