2013-10-22 8 views
5

में पार्सिंग JSON डेटा columnwise जब मैं एक आदेश चला मैं इसखोल

{ 

    "status": "available", 
    "managed": true, 
    "name":vdisk7, 
    "support":{ 
    "status": "supported" 
    }, 
    "storage_pool": "pfm9253_pfm9254_new", 
    "id": "ff10abad"-2bf-4ef3-9038-9ae7f18ea77c", 
    "size":100 
}, 

और सूचियों या शब्दकोशों मैं एक आदेश है कि एक बात यह है कि इस तरह के प्रकार करता है चाहता हूँ के इस प्रकार के सैकड़ों की तरह एक प्रतिक्रिया मिल

if name = "something", 
    get the id 

भी लिंक मुझे आदेशों की इस तरह के प्रकार सीखने में मदद मिलेगी अत्यधिक सराहना की जाएगी

मैं

+०१२३५१६४१० की कोशिश की है

awk '{अगर ($ 2 == "कुछ") $ 0 प्रिंट;}'

लेकिन मुझे लगता है प्रतिक्रिया Json में है, इसलिए colum बुद्धिमान awk स्वरूपण काम नहीं कर रहा।

इसके अलावा यह केवल एक ही कमांड है जिसे मुझे चलाने की आवश्यकता है, इसलिए मैं किसी बाहरी पुस्तकालय का उपयोग नहीं करना चाहूंगा।

+0

आप [JQ पर ध्यान दिया है ] (http://stedolan.github.io/jq/)? फ़िल्टरिंग के लिए यह एक सुविधाजनक वाक्यविन्यास है। – SheetJS

+0

भी देखें [यूनिक्स कमांड लाइन JSON पार्सर] (http://stackoverflow.com/questions/3858671/unix-command-line-json-parser) – koppor

+0

AWK आधारित JSON पार्स के लिए देखें [JSON.awk] (https: //github.com/step-/JSON.awk) – koppor

उत्तर

12

JSON पार्सर इस कार्य

awk और sed लाइन उन्मुख पाठ पार्स करने के लिए उपयोगिताओं, लेकिन नहीं json हैं के लिए बेहतर है। क्या होगा यदि आपका जेसन स्वरूपण बदल जाएगा? (कुछ लाइनें एक लाइन पर जाएंगी?)।

आपको वहां किसी मानक जेसन पार्सर का उपयोग करना चाहिए। या PHP, पायथन, रूबी, आदि जैसे कुछ शक्तिशाली स्क्रिप्टिंग भाषा का उपयोग करें

मैं आपको उदाहरण के साथ पाइथन के साथ यह कैसे प्रदान कर सकता हूं।

यदि मैं शक्तिशाली स्क्रिप्टिंग भाषा का उपयोग नहीं कर सकता तो क्या होगा? link

आप खजाने में शायद पहले से ही कुछ हाल distro, jq है:

आप अजगर का उपयोग करने के लिए पूरी तरह से असमर्थ हैं, तो उपयोगिता jq वहाँ बाहर है (उदाहरण: उबंटू 13.10 रेपोस में यह है)।

मैं अजगर का उपयोग कर सकता हूं!

मैं सरल पायथन इनलाइन स्क्रिप्ट का उपयोग कर ऐसा करूंगा।

उदाहरण के लिए हमारे पास some_command है जो परिणामस्वरूप जेसन लौटाता है।

हमें data["name"] का मूल्य प्राप्त करना होगा।

ये हम चले:

some_command | python -c "import json, sys; print json.load(sys.stdin)['name']" 

यह अपने मामले

इसके लिए में उत्पादन vdisk7 क्या आप वाकई होने की जरूरत है काम करने के लिए होगा, json पूरी तरह से वैध है।

आप json वस्तुओं की एक सूची है:

[ 
    { 
    ... 
    "name": "vdisk17" 
    ... 
    }, 
    { 
    ... 
    "name": "vdisk18" 
    ... 
    }, 
    { 
    ... 
    "name": "vdisk19" 
    ... 
    }, 
... 
] 

आप कुछ सूची comprehensions इस्तेमाल कर सकते हैं:

some_command | python -c "import json, sys; [sys.stdout.write(x['name'] + '\n') for x in json.load(sys.stdin)]" 

यह होगा उत्पादन:

vdisk17 
vdisk18 
vdisk19 
+0

काम करता है। लेकिन मैं awk, ग्रेप, SED, सिर, पूंछ की तरह अजगर, सरल बैश आदेशों का उपयोग करने की अनुमति नहीं कर रहा हूँ, आप अंदाजा हो। –

+0

क्या आप अजगर का उपयोग करने से सीमित करता है? पायथन एलएसबी (लिनक्स मानक आधार) में है। तो यह हर लिनक्स distro पर उपलब्ध होना चाहिए। – Waterlink

+0

@ वाटरलिंक क्या यह एईक्स में भी काम करेगा ?? मैं अभी एईक्स पर परीक्षण नहीं कर सकता लेकिन मुझे कुछ दिनों में ऐसा करने की आवश्यकता हो सकती है। –