cara mencetak hanya garis-garis properti dari file json
contoh file 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"
}
}
]
output yang diharapkan
"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"
Jawaban:
Jq
adalah alat yang tepat untuk memproses data JSON:Hasil:
Jika benar-benar wajib untuk mendapatkan setiap kunci dan nilai yang dikutip ganda - gunakan modifikasi berikut:
Hasil:
sumber
jq
) daripada operasi string naif, yang bagus, tetapi kemudian Anda menggunakan operasi string naif untuk melakukan (terbatas) proses urutan melarikan diri untuk output. Bagi saya itu bukan ide yang bagus.jq
harus memiliki cara untuk keluar dari nilai output dengan benar, bukan?jq
memiliki beberapa cara untuk keluar dari nilai output (seperti@text
,@sh
dll) dengan benar, itu tidak akan membantu dalam kasus khusus ini.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Tolong, tolong jangan membiasakan parsing data terstruktur dengan alat tidak terstruktur. Jika Anda mem-parsing XML, JSON, YAML dll., Gunakan parser tertentu, setidaknya untuk mengubah data terstruktur menjadi bentuk yang lebih tepat untuk AWK
sed
,,grep
dll.Dalam hal ini,
gron
akan sangat membantu:(Anda dapat memposting proses ini dengan
| cut -d. -f4- | gron --ungron
untuk mendapatkan sesuatu yang sangat dekat dengan output yang Anda inginkan, meskipun masih sebagai JSON yang valid.)jq
adalah juga tepat .sumber
From Sed - An Introduction and Tutorial oleh Bruce Barnett :
Untuk pencocokan yang lebih tepat dan juga mengurus penutupan garis braket dengan spasi kosong yang dapat Anda gunakan
sumber
/}/
lebih aman daripada/}$
. Yang terakhir tampaknya tidak memiliki kelebihan apa pun.content
garis yang berisi suatu}
tempat.gron
ataujq
merupakan pendekatan yang lebih baik.sed
satu liner. Mencetak garis antara ekspresi regulerproperties
(yaitu garis yang berisi "properti") dan ekspresi reguler^ *}
(yaitu garis yang dimulai dengan nol atau lebih banyak spasi diikuti oleh "}" dan akhir baris).awk
satu liner.sumber
//!p
artinya Cetak kalau bukan salah satu hal yang cocok?//
mengulangi regex terakhir,!
bukan,p
cetak. Bagus.Ini ditandai
perl
, dan saya belum melihatperl
jawaban, jadi saya akan masukkan.Jangan gunakan ekspresi reguler atau parser 'tidak terstruktur' lainnya.
perl
memilikiJSON
modul dengannya. (JSON::PP
Adalah bagian dari inti sejak 5.14 juga)Secara alami Anda akan membaca dari
STDIN
atau nama file daripadaDATA
dalam skenario penggunaan nyata Anda.sumber