awk / sed / perl এক লাইনার + কীভাবে কেবল জসন ফাইল থেকে বৈশিষ্ট্যগুলি লাইন প্রিন্ট করা যায়


10

কিভাবে জসন ফাইল থেকে কেবল বৈশিষ্ট্যগুলি লাইন প্রিন্ট করতে হয়

জেসন ফাইলের উদাহরণ

{
  "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"
      }
    }
  ]

প্রত্যাশিত আউটপুট

    "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"

3
এসও সম্পর্কিত প্রশ্ন: ইউনিক্স সরঞ্জামগুলির সাথে
জেএসনকে

এছাড়াও সম্পর্কিত: স্ট্যাকওভারফ্লো.com
কার্তিক

উত্তর:


33

Jq JSON ডেটা প্রক্রিয়াকরণের সঠিক সরঞ্জাম:

jq '.items[].properties | to_entries[] | "\(.key) : \(.value)"' input.json

আউটপুট:

"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"

যদি প্রতিটি কী এবং ডাবল-কোট মান করা সত্যিই বাধ্যতামূলক হয় - তবে নিম্নলিখিত পরিবর্তনটি ব্যবহার করুন:

jq -r '.items[].properties | to_entries[]
       | "\"\(.key)\" : \"\(.value | gsub("\n";"\\n"))\","' input.json

আউটপুট:

"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",

আপনি jqনিষ্কলুষ স্ট্রিং ক্রিয়াকলাপের পরিবর্তে একটি বাক্য গঠন-সচেতন সরঞ্জাম ( ) ব্যবহারের পক্ষে ছিলেন , যা ভাল তবে আপনি আউটপুটটির জন্য (সীমাবদ্ধ) অব্যাহতি সিকোয়েন্স প্রসেসিংয়ের জন্য একটি নিষ্কলুষ স্ট্রিং অপারেশন ব্যবহার করেন। এটি আমার কাছে ভাল ধারণা বলে মনে হয় না। jqআউটপুট জন্য মান সঠিকভাবে এড়াতে একটি উপায় থাকতে হবে, তাই না?
ড্যানিয়েল প্রাইডেন

@ ড্যানিয়েলপ্রাইডেন, না। যদিও jqআউটপুট (যেমন @text, @shইত্যাদি) এর মান যথাযথভাবে পালানোর কিছু উপায় রয়েছে তবে সেগুলি এই বিশেষ ক্ষেত্রে সহায়তা করবে না।
রোমানপ্রেখারেস্ট

একটি বৈকল্পিক যা JSON অবজেক্ট হিসাবে বৈশিষ্ট্যগুলির মানগুলিকে ছেড়ে দেয় এবং অযাচিত ধনুর্বন্ধনী এবং সাদা স্থান ছিনিয়ে নেওয়ার জন্য সেড ব্যবহার করে:jq '.items[].properties' input.json | sed -n 's/^\s\+//p'
জো লি-ময়েট

আমার প্রত্যাশিত ফলাফল হিসাবে কেন "," আউটপুটে উপস্থিত হয় না?
ইয়েল

আপনি কি দয়া করে আমার "প্রত্যাশিত আউটপুট" দেখতে পাচ্ছেন, আপনি কি আমার প্রত্যাশিত ফলাফল অনুসারে উত্তরটি সম্পাদনা করতে পারবেন?
ইয়াইল

27

দয়া করে, কাঠামোগত উপাত্তগুলি দিয়ে কাঠামোগত ডেটা পার্স করার অভ্যাসে প্রবেশ করবেন না। আপনি XML পার্স থাকেন, তবে তাদেরকে JSON, YAML ইত্যাদি একটি নির্দিষ্ট পার্সার ব্যবহার করেন, অন্তত awk, একটি আরো উপযুক্ত ফর্ম মধ্যে কাঠামোবদ্ধ ডেটা রূপান্তর করতে sed, grepইত্যাদি

এই ক্ষেত্রে, gronব্যাপক সাহায্য করবে:

$ gron yourfile | grep -F .properties.
json.items[0].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=/usr/lib/ccache:/home/steve/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/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=:/usr/lib/ambari-metrics-kafka-sink/ambari-metrics-kafka-sink.jar\n  export 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";
json.items[0].properties.is_supported_kafka_ranger = "true";
json.items[0].properties.kafka_log_dir = "/var/log/kafka";
json.items[0].properties.kafka_pid_dir = "/var/run/kafka";
json.items[0].properties.kafka_user = "kafka";
json.items[0].properties.kafka_user_nofile_limit = "128000";
json.items[0].properties.kafka_user_nproc_limit = "65536";

(আপনি | cut -d. -f4- | gron --ungronআপনার পছন্দসই আউটপুটটির খুব কাছাকাছি কিছু পাওয়ার জন্য এটি পোস্ট-প্রক্রিয়া করতে পারেন , যদিও এখনও বৈধ JSON হিসাবেই না))

jqহয় এছাড়াও উপযুক্ত


2

সেড থেকে - ব্রুস বার্নেটের একটি ভূমিকা এবং টিউটোরিয়াল :

sed -n '/properties/,/}$/ {
            /properties/n
            /}$/ !p
        }' FILE.json

আরও সঠিক ম্যাচের জন্য এবং আপনি ব্যবহার করতে পারেন এমন অতিরিক্ত সাদা স্থানের সাথে বন্ধনী লাইন বন্ধ করার যত্ন নিতেও

sed -E -n '/"properties" : {/,/^[[:blank:]]*}[[:blank:]]$/ {
               /"properties" : {/n
               /^[[:blank:]]*}[[:blank:]]$/ !p
           }' FILE.json

আমি জেএসএনের সাথে পরিচিত নই তবে সম্ভবত এর /}/চেয়ে নিরাপদ /}$। পরেরটির মনে হয় কোনওভাবেই কোনও সুবিধা নেই।
হউক লেগেইজ

1
@ হককিজিং-লাইন শেষের চিহ্ন ছাড়াই এটি ইতিমধ্যে কোথাও থাকা contentলাইনটির সাথে মেলে }
nohillside

5
যদিও এটি সম্ভব, এটি সম্ভবত উদাহরণস্বরূপ ফাইলে কাজ করবে । আপনি যদি কাঠামোগত ডেটা পার্স করতে চান তবে তার জন্য ডিজাইন করা কিছু ব্যবহার করা উচিত। এটি জেকি, এক্সপাথ, ইয়াক, এক্সকিউ, ইত্যাদি হোন কারণ এটি লাইন-ওরিয়েন্টেড সরঞ্জামগুলির সাথে পার্স করা শেষ পর্যন্ত আপনাকে পিছনে এবং ডিবাগিংয়ে কামড় দেবে যা সম্ভবত খুব সহজ নয়।
নারেট

উদাহরণস্বরূপ, যদি কোনও 'হরেফ' ক্ষেত্রের মধ্যে "বৈশিষ্ট্য" শব্দটি থাকে তবে কী হবে?
স্টিগ হেমার

1
@ স্টিটিহেমার এ কারণেই আমি দ্বিতীয় উদাহরণটিতে প্যাটার্নটি প্রসারিত করেছি। তবে আমি পুরোপুরি একমত যে ব্যবহার করা gronবা jqআরও ভাল পদ্ধতির।
nohillside

2

sedএক রৈখিক. নিয়মিত অভিব্যক্তি properties(যেমন "বৈশিষ্ট্যগুলি সহ লাইন) এবং নিয়মিত অভিব্যক্তির মধ্যে লাইনগুলি মুদ্রণ করুন (অর্থাত" ^ *}শূন্য বা আরও বেশি স্পেস দিয়ে শুরু করা লাইন "}" এবং লাইন-অব-লাইন অনুসরণ করবে)।

sed -n '/properties/,/^ *}$/{//!p}' file.json

awk এক রৈখিক.

awk '/^ *}/{s=0}/properties/{getline;s=1}s' file.json

আপনার প্যাটার্নের মিলটি কীভাবে কাজ করে তা আপনি ব্যাখ্যা করতে পারেন।
vfbsilva

1
এটি প্রদত্ত উদাহরণস্বরূপ ফাইলটির জন্য কাজ করার সময়, এটি JSON কে বোঝে না এমন সরঞ্জামগুলির সাথে পার্স করার চেষ্টা করা ঝুঁকিপূর্ণ। উদাহরণস্বরূপ, যদি কোনও 'হরেফ' ক্ষেত্রের মধ্যে "বৈশিষ্ট্য" শব্দটি থাকে তবে কী হবে? এটি শীর্ষ ভোটের উত্তরের মতো জেএসএন-সচেতন সরঞ্জামের চেয়ে কম বাগ-প্রবণ।
স্টিগ হেমার

3
সম্মত, ঝুঁকিপূর্ণ। তবে ওপি বিশেষত সেড / অ্যাজক / পার্ল ব্যবহার করে ওয়ান-লাইনারের সমাধান চেয়েছিল। আমি যে উত্তরটি দিয়েছি তা এই সমস্ত মানদণ্ডগুলি পূরণ করে।
স্টিভ

কী //!pমানে? মেলে এমন একটা জিনিস না ছাপলে?
ডেভিড কনরাড

1
আহ, এটি পেয়েছে , প্রিন্ট নয়, //সর্বশেষ রেজেক্স পুনরাবৃত্তি করেছে । খুশী হলাম। !p
ডেভিড কনরাড

1

এটি ট্যাগ হয়েছে perl, এবং আমি perlএখনও কোনও উত্তর দেখতে পাচ্ছি না , তাই আমি চিপ করব।

নিয়মিত এক্সপ্রেশন বা অন্যান্য 'কাঠামোগত' পার্সার ব্যবহার করবেন না। perlএটির সাথে JSONমডিউল আছে । ( JSON::PP5.14 সাল থেকেও মূল অংশ)

#!/usr/bin/env perl

use strict;
use warnings;
use JSON;
use Data::Dumper;

my $str = do { local $/; <DATA> };

my $json = decode_json ( $str );

my $properties = $json -> {items} -> [0] -> {properties}; 

#dump the whole lot:
print Dumper $properties;


# or iterate
foreach my $key ( sort keys %$properties ) { 
   print "$key => ", $properties -> {$key},"\n";
}


__DATA__
{
  "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"
      }
    }
  ]
}

স্বাভাবিকভাবেই আপনি আপনার আসল ব্যবহারের দৃশ্যের STDINপরিবর্তে ফাইল ফাইল বা পড়াবেন readDATA

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.