jq
पहले ही कुछ बार उल्लेख किया गया है, इसलिए मैं उल्लेख करूंगा jsonpipe
। यह धर्मान्तरित json
एक लाइन उन्मुख तरह प्रसंस्करण के लिए उपयुक्त प्रारूप आदेश उपकरणों के साथ करने के लिए डेटा grep
, sed
, awk
, perl
, आदि यह के साथ काम करने के लिए दोनों एक कमांड लाइन उपकरण है json
एक खोल में, और एक अजगर पुस्तकालय।
उदाहरण के लिए, यदि आपका नमूना json डेटा नामक फ़ाइल में सहेजा जाता है alex.json
, और फिर संपादित किया जाता है ताकि यह वास्तव में मान्य json हो:
$ jsonpipe < alex.json
/ {}
/items []
/items/0 {}
/items/0/name "first-block-e70a2fe8fd0531ad1f87de49f03537a6"
/items/0/type "STORE"
/items/0/hostRef {}
/items/0/hostRef/hostId "166219e3-be5c-46d0-b4c7-33543a29ce32"
/items/0/roleState "STARTED"
/items/0/healthSummary "GOOD"
/items/1 {}
/items/1/name "second-block-c21a1ae8dd2831cd1b87de49f98274e8"
/items/1/type "STORE"
/items/1/hostRef {}
/items/1/hostRef/hostId "176429e3-be5c-46d0-b4c7-33543a29ad63"
/items/1/roleState "STARTED"
/items/1/healthSummary "GOOD"
/items/2 {}
/items/2/name "first-block-a85d2fe6fd0482ad1f54de49f45174a0"
/items/2/type "STORE"
/items/2/hostRef {}
/items/2/hostRef/hostId "176429e3-ae1d-46d0-b4c7-66123a24fa82"
/items/2/roleState "STARTED"
/items/2/healthSummary "GOOD"
फिर आप इसे कुछ भी निकालने के लिए awk में पाइप कर सकते हैं, जो कि पैटर्न / प्रथम-ब्लॉक / से शुरू होने वाले / hostId / के साथ समाप्त होने वाली श्रेणी के दूसरे क्षेत्र में hostId जैसा दिखता है।
$ jsonpipe < alex.json |
awk '/first-block/,/hostId/ {
if ($2 ~ /\"[a-f0-9]{8}-/) {
gsub(/\"/,"",$2);
print $2
}
}'
166219e3-be5c-46d0-b4c7-33543a29ce32
176429e3-ae1d-46d0-b4c7-66123a24fa82
BTW, आप jsonpipe
"पैराग्राफ" प्रारूप में आउटपुट प्राप्त कर सकते हैं , प्रत्येक "आइटम" के साथ एक अलग पैराग्राफ में इसे पाइप करके sed
। इस मामले में, प्रत्येक आइटम रिकॉर्ड से पहले एक नई पंक्ति जोड़ें।
$ jsonpipe < alex.json |
sed -e 's/\/items\/[[:digit:]]\+[[:blank:]]\+/\n&/'
/ {}
/items []
/items/0 {}
/items/0/name "first-block-e70a2fe8fd0531ad1f87de49f03537a6"
/items/0/type "STORE"
/items/0/hostRef {}
/items/0/hostRef/hostId "166219e3-be5c-46d0-b4c7-33543a29ce32"
/items/0/roleState "STARTED"
/items/0/healthSummary "GOOD"
/items/1 {}
/items/1/name "second-block-c21a1ae8dd2831cd1b87de49f98274e8"
/items/1/type "STORE"
/items/1/hostRef {}
/items/1/hostRef/hostId "176429e3-be5c-46d0-b4c7-33543a29ad63"
/items/1/roleState "STARTED"
/items/1/healthSummary "GOOD"
/items/2 {}
/items/2/name "first-block-a85d2fe6fd0482ad1f54de49f45174a0"
/items/2/type "STORE"
/items/2/hostRef {}
/items/2/hostRef/hostId "176429e3-ae1d-46d0-b4c7-66123a24fa82"
/items/2/roleState "STARTED"
/items/2/healthSummary "GOOD"
अनुच्छेद से पृथक डेटा एक बहुत ही आम स्वरूप है, और इस तरह आम उपकरणों awk
और sed
और perl
1 विशेषताएं है कि यह आसान पैराग्राफ के साथ कार्य करने की है। इसके अलावा, इस तरह के काम के कई उदाहरण आसानी से इस और अन्य एसई साइटों पर पाए जाते हैं, साथ ही साथ Google भी।
अंत में, इस पंक्ति-उन्मुख फ्लैट प्रारूप को वापस जसन में बदलने के लिए jsonpipe
एक jsonunpipe
समकक्ष है।
उदाहरण के लिए, यदि आप संरचना को समतल करना चाहते हैं, ताकि hostId के बजाय hostId एक आइटम की एक संपत्ति हो:
$ jsonpipe < alex.json |
sed -e '/hostRef[[:blank:]]/d;s/hostRef\///' |
jsonunpipe
{"items": [{"name": "first-block-e70a2fe8fd0531ad1f87de49f03537a6", "type": "STORE", "hostId": "166219e3-be5c-46d0-b4c7-33543a29ce32", "roleState": "STARTED", "healthSummary": "GOOD"}, {"name": "second-block-c21a1ae8dd2831cd1b87de49f98274e8", "type": "STORE", "hostId": "176429e3-be5c-46d0-b4c7-33543a29ad63", "roleState": "STARTED", "healthSummary": "GOOD"}, {"name": "first-block-a85d2fe6fd0482ad1f54de49f45174a0", "type": "STORE", "hostId": "176429e3-ae1d-46d0-b4c7-66123a24fa82", "roleState": "STARTED", "healthSummary": "GOOD"}]}
यदि आवश्यक हो, तो आप इसे मानव पठनीयता के लिए सुंदर प्रिंट के माध्यम से jq
या json_pp
उसके समान पाइप कर सकते हैं ।
1 perl
में जर्स डेटा को पार्स करने और हेरफेर करने के लिए कई उत्कृष्ट मॉड्यूल हैं, इसलिए आप शायद उनमें से किसी एक का उपयोग करके बेहतर हैं। जब भी आप अपने आप को पाइपिंग डेटा से grep
, sed
और / या awk
में पाते हैं perl
, तो आपको वास्तव में खुद से पूछना चाहिए "मैं ऐसा क्यों कर रहा हूं? यह पागल है, मुझे पूरी बात सिर्फ पर्ल में करनी चाहिए"। उसी के लिए कहा जा सकता है python
।