comment imprimer uniquement les lignes de propriétés du fichier json
exemple de fichier 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"
}
}
]
production attendue
"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"
Réponses:
Jq
est le bon outil pour traiter les données JSON:Le résultat:
Dans le cas où il est vraiment obligatoire d'obtenir chaque clé et valeur entre guillemets - utilisez la modification suivante:
Le résultat:
la source
jq
) plutôt que des opérations de chaîne naïves, ce qui est bien, mais vous utilisez ensuite une opération de chaîne naïve pour effectuer un traitement de séquence d'échappement (limité) pour la sortie. Cela ne me semble pas une bonne idée.jq
doit avoir un moyen d'échapper correctement la valeur de sortie, non?jq
qu'il existe des moyens d'échapper correctement la valeur de sortie (comme@text
,@sh
etc.), cela n'aidera pas dans ce cas particulier.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Veuillez ne pas prendre l'habitude d'analyser des données structurées avec des outils non structurés. Si vous analysez XML, JSON, YAML etc., utilisez un analyseur spécifique, au moins pour convertir les données structurées sous une forme plus appropriée pour AWK
sed
,grep
etc.Dans ce cas,
gron
cela aiderait grandement:(Vous pouvez post-traiter cela avec
| cut -d. -f4- | gron --ungron
pour obtenir quelque chose de très proche de la sortie souhaitée, bien que toujours en JSON valide.)jq
est également approprié .la source
De Sed - Une introduction et un tutoriel de Bruce Barnett :
Pour une correspondance plus exacte et pour prendre également soin de fermer les lignes de support avec des espaces supplémentaires, vous pouvez utiliser
la source
/}/
- être est plus sûr que/}$
. Ce dernier ne semble de toute façon pas avoir d'avantages.content
ligne qui contient un}
quelque part.gron
oujq
est la meilleure approche.sed
bon mot. Affiche les lignes entre l'expression régulièreproperties
(c'est-à-dire la ligne contenant "propriétés") et l'expression régulière^ *}
(c'est-à-dire la ligne commençant par zéro ou plusieurs espaces suivis de "}" et de fin de ligne).awk
bon mot.la source
//!p
dire? Imprimer sinon une des choses qui correspondent?//
répète le dernier regex,!
pas,p
imprime. Agréable.C'est tagué
perl
, et je ne vois pasperl
encore de réponse, alors je vais intervenir.N'utilisez pas d'expressions régulières ou d'autres analyseurs «non structurés».
perl
a leJSON
module avec lui. (JSON::PP
fait également partie du noyau depuis 5.14)Naturellement, vous devriez lire
STDIN
ou un nom de fichier plutôt queDATA
dans votre scénario d'utilisation réel.la source