Grep / sed / awk का उपयोग करके स्ट्रिंग से शब्द निकालें


12

मेरे पास एक तार है

00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256

और इस शब्द को निकालना चाहते qaहैं -Dspring.profiles.active

मैं एक फ़ाइल text.txt में इस पर डेमो करने के लिए स्ट्रिंग को बचाने के लिए है।

जब मैं करता हूं

grep -r -o "spring.profiles.active=" text.txt

परिणाम है spring.profiles.active=

यह शब्द हमेशा नहीं होता है qa, यह हो सकता है prodया हो सकता है dev

मैं जो करना चाहता हूं वह शब्द है spring.profiles.activeऔर उस शब्द को निकालने के बाद=

मैं इसकी स्क्रिप्ट करना चाहूंगा क्योंकि मैं सर्वर पर अन्य वस्तुओं को कॉन्फ़िगर करने के लिए शब्द का उपयोग करता हूं ।

क्या यह संभव है और यदि हां, तो मैं यह कैसे कर सकता हूं।


मैं अनुमान लगा रहा हूं कि इस बारे में पहले ही मेटा बातचीत हो चुकी है, लेकिन यह सवाल उबंटू के लिए पूरी तरह से गैर-विशिष्ट है। यह unix.stackexchange.com के बजाय यहाँ क्यों है ?
टोनी एडम्स

@TonyAdams हाँ वहाँ है: पाठ-प्रसंस्करण प्रश्न अप्रत्यक्ष रूप से यहां कवर किए गए हैं , और वैसे भी वास्तव में उन्हें हमेशा विषय पर माना गया है और कभी भी बंद / विस्थापित नहीं किया गया है; उबंटू-specificness, कि कई बार कवर किया गया है, दो बार अभी हाल ही में पर यहाँ और दो प्रतियों में और एक बार यहाँ
कोस

अच्छा प्रश्न! : D
n कंप्यूटर्स

जवाबों:


20

आप grepपीसीआरई ( -P) के साथ उपयोग कर सकते हैं :

grep -Po 'spring.profiles.active=\K[^ ]+' <<<'.....string.....'
  • spring.profiles.active=शाब्दिक रूप से इस विकल्प का मिलान करेगा, मैच \Kको त्याग देगा

  • [^ ]+spring.profiles.active=अगले भाग तक वांछित भाग यानी भाग के बाद का चयन करेंगे

एक फ़ाइल के लिए:

grep -Po 'spring.profiles.active=\K[^ ]+' file.txt

उदाहरण:

% grep -Po 'spring.profiles.active=\K[^ ]+' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

sed समान तर्क लेगा:

sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'.....string.....'

उदाहरण:

% sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

हैंडलिंग त्रुटियाँ:

आपकी स्क्रिप्ट में आप उस मामले को संभालना चाहते हैं जहां कोई मेल नहीं है, दूसरे शब्दों में जहां आपके मूल स्ट्रिंग में नहीं है spring.profiles.active=। उपरोक्त sedउदाहरण में, आप संपूर्ण मूल स्ट्रिंग प्राप्त करते हैं, जो समस्याएं पैदा कर सकता है:

% var="$(sed -r 's/.*spring.profiles.active=([^ ]+).*/\1/' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var
00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256

यदि आप कोई मेल नहीं होने पर खाली स्ट्रिंग प्राप्त करना पसंद करते हैं, -nतो sedकमांड का pविकल्प और कमांड के विकल्प को sed sइस तरह जोड़ें:

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -XX:MaxPermSize=256')"
% echo $var

% var="$(sed -rn 's/.*spring.profiles.active=([^ ]+).*/\1/p' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256')"
% echo $var
qa

तब आप परीक्षण कर सकते हैं कि $ वर खाली है या नहीं।


धन्यवाद @heemay, सही काम करता है। अब मुझे सिर्फ स्क्रिप्ट की जरूरत है। मैं इसे उत्तर के रूप में चिह्नित करूंगा
Gman

@ हेमेय आपको पता होगा कि मैं यह कैसे लिख सकता हूं। मेरे पास यह एक स्क्रिप्ट में है और जब यह चलता है तो इसे qa लौटाते हैं। मैं परिणाम को env नामक एक चर में सहेजना चाहता हूं और फिर उसकी तुलना कुछ इस तरह से करना चाहता हूं। अगर [env == qa]; तो // जाने वाली चीज़ ... वरना क्या कुछ ...
GMAN

1
@Gman हाँ .. बस आदेश प्रतिस्थापन का उपयोग करें: var="$(grep -Po 'spring.profiles.active=\K[^ ]+' file.txt)"की जगह file.txtके साथ <<<'...string...'करता है, तो इनपुट एक स्ट्रिंग, नहीं एक file..then आप क्या कर सकते हैंif [ "$var" = 'qa' ]; then do something; else do something; fi
heemayl

1

का उपयोग करते हुए awk

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'your_string'

या

awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' your_file

उदाहरण

% awk -F"-Dspring.profiles.active=" '{sub(/ .*/,"",$2);print $2}' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
qa

1

मैं मिश्रण में एक पर्ल फेंक दूंगा:

<<<'string' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
  • -l: स्वचालित लाइन-एंड प्रोसेसिंग को सक्षम करता है। इसके दो अलग-अलग प्रभाव हैं। सबसे पहले, यह स्वचालित रूप से $ / (इनपुट रिकॉर्ड सेपरेटर) को -n या -p के साथ उपयोग करने पर chomps करता है। दूसरा, यह ऑक्टनम का मूल्य रखने के लिए $ \ (आउटपुट रिकॉर्ड सेपरेटर) प्रदान करता है ताकि किसी भी प्रिंट स्टेटमेंट में उस विभाजक को वापस जोड़ा जा सके। यदि ऑक्टनम को छोड़ दिया जाता है, तो $ / को $ / के वर्तमान मूल्य पर सेट किया जाता है।
  • -a: -n या -p के साथ उपयोग किए जाने पर ऑटोसप्लिट मोड को चालू करता है। @F सरणी के लिए एक अंतर्निहित विभाजन कमांड -n या -p द्वारा निर्मित लूप जबकि निहित के अंदर पहली चीज के रूप में किया जाता है।
  • n: पर्ल आपके प्रोग्राम के चारों ओर निम्नलिखित लूप को ग्रहण करने का कारण बनता है, जो इसे फ़ाइल नाम तर्कों पर कुछ हद तक sed -n और awk की तरह बनाता है:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: कार्यक्रम की एक पंक्ति में प्रवेश करने के लिए इस्तेमाल किया जा सकता है।
% <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256' perl -lane '$F[3]=~s/.*?=//;print($F[3])'
qa

मूल perl -nle '/spring.profiles.active=\K([^ ]+)/ && print $1' <<<'00:28:04 /usr/lib/jvm/jre/bin/java -DJDBC_CONNECTION_STRING= -Dspring.profiles.active=qa -XX:MaxPermSize=256'
रीगेक्स का
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.