"टर्म" के लिए grep और "एक और टर्म" को बाहर करें


28

मैं एक grep खोज बनाने की कोशिश कर रहा हूं, जो एक शब्द की खोज करता है, लेकिन उन लाइनों को छोड़ देता है जिनके पास दूसरा शब्द है। मैं कई -e "pattern"विकल्पों का उपयोग करना चाहता था लेकिन यह काम नहीं किया।

यहां एक कमांड का प्रयास किया गया है और इसे उत्पन्न त्रुटि संदेश का एक उदाहरण है।

grep -i -E "search term" -ev "exclude term"
grep: exclude term: No such file or directory

यह मुझे लगता है कि -vसभी खोज शब्दों / पैटर्न पर लागू होता है। जैसा कि यह चलता है लेकिन फिर search termपरिणामों में शामिल नहीं होता है ।

grep -i -E "search term" -ve "exclude term"

क्या बाहर करने के लिए कोई अन्य विकल्प है, जैसे कभी-कभी हमें एक शब्द के चारों ओर रेखाओं को पकड़ना पड़ता है और यदि हम 'ऑपरेशन' का उपयोग करते हुए अगले ऑपरेशन में बाहर करते हैं। , यह सिर्फ उस शब्द को हटा देता है, लेकिन उस शब्द के लिए ब्लॉक को नहीं हटाता
शिक्षार्थी

जवाबों:


40

करने के लिए और ग्रेप साथ भाव आप दो आमंत्रण की जरूरत है:

grep -Ei "search term" | grep -Eiv "exclude term"

यदि आप जिन शब्दों को खोज रहे हैं वे नियमित अभिव्यक्ति नहीं हैं, तो निश्चित स्ट्रिंग मिलान ( -F) का उपयोग करें जो तेज है:

grep -F "search term" | grep -Fv "exclude term"

18

दो बार grep का आह्वान करने का तरीका, केवल एक ही तरीका है जिससे मैं इसे पूरा करने के बारे में सोच सकता हूं। इसमें पर्ल कम्पेटिबल रेग्युलर एक्सप्रेशंस (PCRE) और कुछ बल्कि हैकिंग लुक-अराउंड असेसरीज शामिल हैं

बार वाले मैच को छोड़कर फू को खोजने के लिए , आप इसका उपयोग कर सकते हैं:

grep -P '(?=^((?!bar).)*$)foo'

यहां देखिए यह कैसे काम करता है:

  • (?!bar)कुछ भी है कि स्ट्रिंग से पात्रों का उपभोग किए बिना पट्टी से मेल खाता है । फिर .एकल चरित्र का उपभोग करता है।

  • ^((?!bar).)*स्ट्रिंग की शुरुआत ( ^) से इसके अंत तक ( ) तक उपरोक्त दोहराता है $barकिसी भी बिंदु पर सामना करने के बाद यह विफल हो जाएगा , क्योंकि (?!bar)मैच नहीं होगा।

  • (?=^((?!bar).)*$) यह सुनिश्चित करता है कि स्ट्रिंग से पात्रों का उपभोग किए बिना स्ट्रिंग पिछले पैटर्न से मेल खाती है।

  • fooहमेशा की तरह फू की खोज ।

मैंने इस हैक को रेगुलर एक्सप्रेशन में एक शब्द न होने वाले स्ट्रिंग से मिलान करने के लिए पाया ? । में बार्ट Kiers 'जवाब , आप कैसे नकारात्मक लुक-आगे चल रही है की एक बहुत अधिक विस्तृत विवरण मिल सकता है।


अच्छा हैक। यह ट्रिक जावा में भी काम करती है, btw।
रमन

12

यदि आप इसे एक पास में करना चाहते हैं, तो आप grep के बजाय awk का उपयोग कर सकते हैं।

प्रारूप:

echo "some text" | awk '/pattern to match/ && !/pattern to exclude/'

उदाहरण:

  • echo "hello there" | awk '/hello/ && !/there/'

कुछ भी नहीं लौटाता।

  • echo "hello thre" | awk '/hello/ && !/there/'

रिटर्न: हैलो थ्रे

  • echo "hllo there" | awk '/hello/ && !/there/'

कुछ भी नहीं लौटाता।

कई पैटर्न के लिए, आप उन्हें समूहीकृत करने के लिए कोष्ठक का उपयोग कर सकते हैं।

उदाहरण:

  • echo "hello thre" | awk '(/hello/ || /hi/) && !/there/'

रिटर्न: हैलो थ्रे

  • echo "hi thre" | awk '(/hello/ || /hi/) && !/there/'

रिटर्न: हाय थ्रे

  • echo "hello there" | awk '(/hello/ || /hi/) && !/there/'

कुछ भी नहीं लौटाता।

  • echo "hi there" | awk '(/hello/ || /hi/) && !/there/'

कुछ भी नहीं लौटाता।


1
इसने मेरे लिए काम किया, लेकिन मैंने रंगों को खो दिया = पी
लियोपोल्डो सांचेज़

1
क्या उत्पादन से रंग? यदि आप ls के साथ रंगों को संरक्षित करने की कोशिश कर रहे हैं, तो आउटपुट को पार्स करते समय "--color = हमेशा" तर्क का उपयोग करें (या आप टेक्स्ट को पार्स करते समय हमेशा रंगों को खो देंगे)। उदाहरण: ls --color=always | awk '/hello/ && !/goodbye/'
फिलिप रीज़

उत्तर @Philip के लिए धन्यवाद! मैंने पहले भी कोशिश की थी, लेकिन सफलता के बिना। मुझे लगता है कि पैटर्न में रंगीन पाठ है, यह बाद में मेल नहीं खाता है, और मुझे पैटर्न में किसी प्रकार का रंग कोड शामिल करना चाहिए। वैसे भी, तुम्हारा सबसे तेज़ तरीका है जो मुझे grep -Rउबंटू कमांड लाइन का उपयोग करके कई कोड फ़ाइलों में करने के लिए मिला ।
लियोपोल्डो सैंसिएक

1

मेरे प्रयोगों से यह बहुत अंतर नहीं पड़ता है यदि आप अपनी शर्तों को बाहर करते हैं grepया इसके माध्यम से पाइप करते हैं sed। एसईडी में कुछ अन्य उपयोगी टेक्स्ट रिप्लेसमेंट फीचर्स हैं, जिन्हें मैं अक्सर लॉग फाइल के आउट पुट को बेहतर फिल्टर करने के लिए उपयोग करता हूं। इसलिए मैं sed का उपयोग करने जा रहा हूं क्योंकि मैं sed पर बहुत सारे फिल्टर जोड़ देता हूं।

wc /var/log/tomcat/tomcat.2013-01-14.log.1 
  1851725

 / usr / bin / time grep -i -E "(loginmanager)" /var/log/tomcat/tomcat.2013-01-14.log.1 | sed -e "/ login OK / d" -e "/ लॉगिन समाप्त / डी" | स्वागत
24.05user 0.15system 0: 25.27elapsed 95% CPU (0avgtext + 0avgdata 3504maxresident) k
0inputs + 0outputs (0major + 246minor) pagefaults 0swaps
   5614 91168 1186298

 / usr / bin / time grep -i -E "(loginmanager)" /var/log/tomcat/tomcat.2013-01-14.log.1 | sed -e "/ login OK / d" -e "/ लॉगिन समाप्त / डी" | स्वागत
23.50user 0.16system 0: 24.48elapsed 96% CPU (0avgtext + 0avgdata 3504maxresident) k
0inputs + 0outputs (0major + 246minor) pagefaults 0swaps
   5614 91168 1186298

 / usr / bin / time grep -i -E "(loginmanager)" /var/log/tomcat/tomcat.2013-01-14.log.1 | grep -v -e "लॉगिन ठीक है" -e "लॉगिन समाप्त हो गया" | स्वागत
23.08user 0.14system 0: 23.55elapsed 98% CPU (0avgtext + 0avgdata 3504maxresident) k
0inputs + 0outputs (0major + 246minor) pagefaults 0swaps
   5614 91168 1186298

 / usr / bin / time grep -i -E "(loginmanager)" /var/log/tomcat/tomcat.2013-01-14.log.1 | grep -v -e "लॉगिन ठीक है" -e "लॉगिन समाप्त हो गया" | स्वागत
23.50user 0.15system 0: 25.27elapsed 93% CPU (0avgtext + 0avgdata 3488maxresident) k
0inputs + 0outputs (0major + 245minor) pagefaults 0swaps
   5614 91168 1186298


3
grep -Fइसके बजाय के रनटाइम की तुलना करने का प्रयास करें grep -Eऔर -iयदि आपको इसकी आवश्यकता नहीं है तो इसका उपयोग न करें ।
थोर

1
लेकिन तब आप उदाहरणों का उपयोग नहीं करते sed;)
बेंजामिन आर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.