So drucken Sie nur die Eigenschaftszeilen aus der JSON-Datei
Beispiel einer JSON-Datei
{
"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"
}
}
]
erwartete Ausgabe
"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"
Antworten:
Jq
ist das richtige Werkzeug für die Verarbeitung von JSON-Daten:Die Ausgabe:
Falls es wirklich obligatorisch ist, jeden Schlüssel und Wert in doppelte Anführungszeichen zu setzen, verwenden Sie die folgende Änderung:
Die Ausgabe:
quelle
jq
) anstelle von naiven Zeichenfolgenoperationen, was gut ist, aber dann verwenden Sie eine naive Zeichenfolgenoperation, um die (eingeschränkte) Escape-Sequenzverarbeitung für die Ausgabe durchzuführen. Das scheint mir keine gute Idee zu sein.jq
muss eine Möglichkeit haben, dem Ausgabewert richtig zu entkommen, oder?jq
einige Möglichkeiten hat , um richtig den Wert für die Ausgabe zu entkommen (wie@text
,@sh
usw.), werden diejenigen , die in diesem speziellen Fall keine Hilfe.jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
Bitte, bitte gewöhnen Sie sich nicht an, strukturierte Daten mit unstrukturierten Tools zu analysieren. Wenn Sie XML sind Parsen, JSON, YAML usw., einen bestimmten Parser verwenden, zumindest die strukturierten Daten in eine geeignete Form für AWK zu konvertieren,
sed
,grep
usw.In diesem Fall
gron
würde sehr helfen:(Sie können dies nachbearbeiten
| cut -d. -f4- | gron --ungron
, um etwas zu erreichen, das Ihrer gewünschten Ausgabe sehr nahe kommt, wenn auch immer noch als gültiger JSON.)jq
ist auch angemessen .quelle
Aus Sed - Eine Einführung und ein Tutorial von Bruce Barnett :
Für eine genauere Übereinstimmung und um auch das Schließen von Klammerlinien mit zusätzlichen Leerzeichen zu gewährleisten, können Sie diese verwenden
quelle
/}/
ist es sicherer als/}$
. Letzteres scheint ohnehin keine Vorteile zu haben.content
Zeile überein , die}
irgendwo ein enthält .gron
oderjq
der bessere Ansatz ist.sed
Einzeiler. Drucken Sie Zeilen zwischen regulären Ausdrückenproperties
(dh Zeilen mit "Eigenschaften") und regulären Ausdrücken^ *}
(dh Zeilen, die mit null oder mehr Leerzeichen beginnen, gefolgt von "}" und Zeilenende).awk
Einzeiler.quelle
//!p
das Drucken, wenn nicht eines der Dinge, die übereinstimmten?//
wiederholt den letzten regulären Ausdruck ,!
nichtp
drucken. Nett.Es ist markiert
perl
und ich sehe noch keineperl
Antwort, also werde ich eingreifen.Verwenden Sie keine regulären Ausdrücke oder andere "unstrukturierte" Parser.
perl
hat dasJSON
Modul dabei. (JSON::PP
ist seit 5.14 auch Teil des Kerns)Natürlich würden Sie
STDIN
eher aus oder einen Dateinamen lesen alsDATA
in Ihrem realen Nutzungsszenario.quelle