मेरे पास एक JSON इनपुट है:

{
  "policyItems": [
    {
      "accesses": [
        {
          "type": "submit-app",
          "isAllowed": true
        }
      ],
      "users": [],
      "groups": [
        "Application_Team_1",
        "team2"
      ],
      "conditions": [],
      "delegateAdmin": false
    }
  ]
}

मैंने कतार नीति यार्न को दूर करने के लिए कमांड लाइन कर्ल किया था:

curl  -u "login:password" http://myHost:6080/service/public/v2/api/service/YARN_Cluster/policy/YARN%20NameQueue/

यह बढ़िया काम करता है।

फिर मैंने समूह आइटम की सभी सूची निकालने के लिए grep जोड़ा:

curl  -u "login:password" http://myHost:6080/service/public/v2/api/service/YARN_Cluster/policy/YARN%20NameQueue/ | 
grep -oP '(?<="groups": ")[^"]*'

यह निम्नलिखित परिणाम है:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   579    0   579    0     0   4384      0 --:--:-- --:--:-- --:--:--  4419

यह काम नहीं कर रहा है। मैं इसे grep का उपयोग करके कैसे कर सकता हूं न कि jq का?

2
vero 21 जून 2018, 15:46

1 उत्तर

सबसे बढ़िया उत्तर

आप इस्तेमाल कर सकते हैं

grep -Poza '(?:\G(?!^)",|"groups":\s*\[)\s*"\K[^"]+'

विकल्प

  • P - पैटर्न को पार्स करने के लिए पीसीआरई इंजन का उपयोग करें
  • o - आउटपुट मिलान मिले
  • z - पूरी फाइल को स्लरप करें, फाइल को पूरी सिंगल स्ट्रिंग के रूप में मानें
  • a - फ़ाइल को टेक्स्ट फ़ाइल के रूप में मानें (यह इस्तेमाल किया जाना चाहिए क्योंकि जब -z स्विच grep बाइनरी डेटा व्यवहार को ट्रिगर कर सकता है जो रिटर्न मानों को बदल देता है)।

पैटर्न

  • (?:\G(?!^)",|"groups":\s*\[) - या तो पिछले मैच का अंत (\G(?!^)) और फिर ", सबस्ट्रिंग, या (|) एक शाब्दिक टेक्स्ट "groups":, 0+ व्हाइटस्पेस (\s*) और एक [ चार (\[)
  • \s*" - 0+ व्हाइटस्पेस और " char
  • \K - मैच रीसेट ऑपरेटर अब तक मिलान किए गए पूरे टेक्स्ट को छोड़कर
  • [^"]+ - " के अलावा 1+ वर्ण

जैसा कि आप देखते हैं, यह व्यंजक "group": [" ढूंढता है, उस पाठ को छोड़ देता है और उस पाठ के बाद ही " के अंदर प्रत्येक मान से मेल खाता है।

PCRE रेगेक्स डेमो देखें।

1
Wiktor Stribiżew 22 जून 2018, 11:09