como imprimir apenas as linhas de propriedades do arquivo json
exemplo de arquivo 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"
}
}
]
resultado 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"
Respostas:
Jq
é a ferramenta certa para processar dados JSON:A saída:
Caso seja realmente obrigatório obter cada chave e valor entre aspas duplas - use a seguinte modificação:
A saída:
fonte
jq
) em vez de operações ingênuas de seqüência de caracteres, o que é bom, mas usa uma operação ingênua de seqüência de caracteres para executar (limitado) o processamento de seqüência de escape para saída. Isso não parece uma boa ideia para mim.jq
deve ter uma maneira de escapar adequadamente do valor de saída, certo?jq
tem algumas maneiras de escapar corretamente o valor para a saída (como@text
,@sh
etc), aqueles não vai ajudar neste caso particular.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Por favor, não adquira o hábito de analisar dados estruturados com ferramentas não estruturadas. Se você estiver analisando XML, JSON, YAML etc., use um analisador específico, pelo menos para converter os dados estruturados em um formato mais apropriado para AWK
sed
,grep
etc.Nesse caso,
gron
ajudaria bastante:(Você pode pós-processar isso
| cut -d. -f4- | gron --ungron
para obter algo muito próximo da saída desejada, embora ainda como JSON válido.)jq
também é apropriado .fonte
From Sed - Introdução e Tutorial de Bruce Barnett :
Para uma correspondência mais exata e também para fechar as linhas de colchete com espaço em branco adicional, você pode usar
fonte
/}/
seja mais seguro que/}$
. O último parece não ter nenhuma vantagem de qualquer maneira.content
linha que contém um}
lugar.gron
oujq
é a melhor abordagem.sed
um forro. Imprima linhas entre expressão regularproperties
(ou seja, linha contendo "propriedades") e expressão regular^ *}
(ou seja, linha começando com zero ou mais espaços seguidos de "}" e final de linha).awk
um forro.fonte
//!p
significa isso ? Imprimir, se não uma das coisas que combinam?//
repete o último regex,!
nãop
imprima. Legal.Ele está marcado
perl
e não vejoperl
resposta ainda, então vou entrar.Não use expressões regulares ou outros analisadores 'não estruturados'.
perl
tem oJSON
módulo com ele. (JSON::PP
faz parte do núcleo desde 5.14 também)Naturalmente, você deve ler
STDIN
ou um nome de arquivo, e nãoDATA
no seu cenário de uso real.fonte