jak wydrukować tylko linie właściwości z pliku json
przykład pliku 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"
}
}
]
oczekiwany wynik
"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"
Odpowiedzi:
Jq
jest właściwym narzędziem do przetwarzania danych JSON:Wyjście:
Jeśli uzyskanie każdego klucza i wartości podwójnie zacytowane jest naprawdę obowiązkowe - użyj następującej modyfikacji:
Wyjście:
źródło
jq
) zamiast naiwnych operacji na łańcuchach, co jest dobre, ale następnie używasz naiwnej operacji na łańcuchach, aby wykonać (ograniczone) przetwarzanie sekwencji specjalnej dla danych wyjściowych. To nie wydaje mi się dobrym pomysłem.jq
musi mieć sposób, aby właściwie uciec od wartości wyjściowej, prawda?jq
ma kilka sposobów, aby prawidłowo uciec wartość na wyjściu (jak@text
,@sh
etc), ci nie pomoże w tym konkretnym przypadku.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Proszę, nie przyzwyczajaj się do analizowania danych strukturalnych za pomocą nieustrukturyzowanych narzędzi. Jeśli jesteś parsowania XML, JSON, YAML itp używać konkretnego parser, przynajmniej do konwersji ustrukturyzowanych danych w bardziej odpowiedniej formie AWK
sed
,grep
etc.W takim przypadku
gron
bardzo pomogłoby:(Możesz to przetworzyć za pomocą,
| cut -d. -f4- | gron --ungron
aby uzyskać coś bardzo zbliżonego do pożądanego wyniku, aczkolwiek nadal jako prawidłowy JSON.)jq
jest również odpowiednie .źródło
From Sed - Wprowadzenie i samouczek Bruce'a Barnetta :
Aby uzyskać dokładniejsze dopasowanie, a także zadbać o zamykanie linii nawiasów za pomocą dodatkowych białych znaków, których możesz użyć
źródło
/}/
jest bezpieczniejszy niż/}$
. To ostatnie wydaje się nie mieć żadnych zalet.content
linii, która zawiera}
gdzieś.gron
lubjq
jest lepszym podejściem.sed
jedna wkładka. Drukuj linie między wyrażeniem regularnymproperties
(tj. Wiersz zawierający „właściwości”) a wyrażeniem regularnym^ *}
(tj. Linia rozpoczynająca się od zera lub więcej spacji, po której następuje „}” i koniec linii).awk
jedna wkładka.źródło
//!p
znaczy Wydrukować, jeśli nie jedną z pasujących rzeczy?//
powtarza ostatnie wyrażenie,!
niep
drukuj. Miły.Jest otagowany
perl
i nie widzę jeszczeperl
odpowiedzi, więc się włożę.Nie używaj wyrażeń regularnych ani innych „nieustrukturyzowanych” parserów.
perl
maJSON
z nim moduł. (JSON::PP
jest częścią rdzenia od 5.14)Oczywiście czytałbyś z
STDIN
lub nazwę pliku zamiastDATA
w prawdziwym scenariuszu użytkowania.źródło