2017-04-03 8 views
5

प्रत्येक ऑब्जेक्ट के लिए कमांड कमांड चलाने के लिए jq का उपयोग करके jq का उपयोग कर jq का उपयोग कर किसी जेसन सरणी में प्रत्येक जेसन ऑब्जेक्ट के लिए बैश कमांड कैसे चला सकता हूं? अब तक मेरे पास यह है:सरणी

cat credentials.json | jq -r '.[] | .user, .date, .email' | mycommand -u {user} -d {date} -e {email} 

यह काम नहीं प्रतीत होता है। मैं अपने आदेश में जेसन सरणी से पैरामीटर कैसे ले सकता हूं?

मेरे json फ़ाइल इस तरह दिखता है:

[ 
    "user": "danielrvt", 
    "date": "11/10/1988", 
    "email": "[email protected]", 
    ... 
] 

उत्तर

9

आपका सबसे अच्छा शर्त शायद उत्पादन के लिए TSV स्वरूप की तरह कुछ में प्रत्येक रिकॉर्ड है, तो वह एक खोल पाश से पढ़ें।

jq -r '.[]|[.user, .date, .email] | @tsv' | 
    while IFS=$'\t' read -r user date email; do 
    mycommand -u "$user" -d "$date" -e "$email" 
    done 

jq अपने आप में एक system कॉल एक फिल्टर के भीतर से एक बाहरी कमांड को चलाने के लिए ऐसा कुछ भी नहीं है, हालांकि यह है कि they are working on it लगता है।

2

आप jq उत्पादन आदेश पर अमल करने के लिए, की तरह

.[] | "mycommand \(.user|@sh) \(.date|@sh) \(.email|@sh)" 

तो यह अमल कुछ हो सकता था। कुछ

bash <(jq -r '.[] | "mycommand \(.user|@sh) \(.date|@sh) \(.email|@sh)"' foo)