grep कई स्ट्रिंग्स को बाहर करें


117

मैं पूंछ का उपयोग करके एक लॉग फ़ाइल देखने की कोशिश कर रहा हूं -fऔर निम्नलिखित तारों वाली सभी लाइनों को बाहर करना चाहता हूं:

"Nopaging the limit is"`  and `"keyword to remove is"

मैं इस तरह से एक स्ट्रिंग को बाहर करने में सक्षम हूं:

tail -f admin.log|grep -v "Nopaging the limit is"

लेकिन मैं string1या तो युक्त रेखाओं को कैसे बाहर निकालूं string2

जवाबों:


107

Grep के साथ कई लाइनों को फ़िल्टर करने के दो उदाहरण:

इसे इसमें डालें filename.txt:

abc
def
ghi
jkl

एक स्ट्रिंग में टोकन के बीच पाइप के साथ grep कमांड का उपयोग -E विकल्प:

grep -Ev 'def|jkl' filename.txt

प्रिंट:

abc
ghi

कमांड का उपयोग कर -v विकल्प के साथ पाइप से घिरा हुआ टोकन के बीच:

egrep -v '(def|jkl)' filename.txt

प्रिंट:

abc
ghi

15
मुझे आश्चर्य है कि कोई भी उस grep -v -e def -e jklविधि के बारे में बात नहीं करता है जो
आईएमएचओ

4
या इससे भी बेहतर: grep -Fv -e def -e jklजो और भी तेज है!
१५:१z बजे फ्रेज़लाब

11
-F फ्लैग के साथ, आप पाइप के बजाय सीमांकक के रूप में नईलाइन्स का उपयोग कर सकते हैं। यह फिल्टर के रूप में कमांड आउटपुट का उपयोग अधिक आसानी से करने की अनुमति देता है, जैसे:grep -vF $(pgrep myprocess)
फुलक्स

45
grep -Fv -e 'Nopaging the limit is' -e 'keyword to remove is'

-F शाब्दिक तार द्वारा मिलान (रेगेक्स के बजाय)

-v मैच का विरोध करता है

-e एकाधिक खोज पैटर्न (सभी शाब्दिक और उल्टे) के लिए अनुमति देता है


1
यह सही उत्तर है: केवल एक ही जो कई grep -vउदाहरणों और एक रेगेक्स की कृत्रिम आवश्यकता से बचा जाता है (कई तारों को अलग-अलग तर्कों में साफ-साफ निर्दिष्ट किया जाता है)। बस कल्पना कर सकते हैं कि regex प्रोग्राम स्क्रिप्ट में स्ट्रिंग के लिए जो कुछ भी हो सकता है ...
user2394284

वास्तव में इनमें से कोई भी सही उत्तर नहीं है क्योंकि जब कोई भी कीवर्ड बाहर करने के लिए इसे पास नहीं करता है तो कुछ भी नहीं के बजाय सब कुछ बाहर कर देगा।
ग्योरी सिन्दूर

37

एक अन्य विकल्प एक बहिष्कृत सूची बनाना है, यह कण उपयोगी है जब आपके पास बहिष्कृत करने के लिए लंबी सूची होती है।

vi /root/scripts/exclude_list.txt

अब वह जोड़ें जिसे आप बाहर करना चाहते हैं

Nopaging the limit is
keyword to remove is

अब अपनी फ़ाइल लॉग फ़ाइल से लाइनें हटाने के लिए grep का उपयोग करें और जानकारी को बाहर न रखें।

grep -v -f /root/scripts/exclude_list.txt /var/log/admin.log

1
मुझे नहीं पता था कि आप (या बाद वाले भी मौजूद थे) के -vसाथ उपयोग कर सकते हैं -f
श्रीधर सरनोबत

बहुत उपयोगी है!
samaspin

ध्यान दें, कि आपको बहिष्करण सूची के लिए अस्थायी फ़ाइल नहीं बनानी है। बैश में आप प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं। यह आसान है यदि बहिष्करण सूची थोड़े गतिशील है और आपको इसे केवल एक बार उपयोग किए जाने से पहले उत्पन्न करना होगा:grep -v -f <(gen_exclusions.sh) /var/log/admin.log
Miroslav



11

आप इस तरह से नियमित grep का उपयोग कर सकते हैं:

tail -f admin.log | grep -v "Nopaging the limit is\|keyword to remove is"


1
इस जवाब ने मेरे लिए MacOSX पर काम किया। पाइप को
बचाना

5

ग्रीप्स जंजीर हो सकते हैं। उदाहरण के लिए:

tail -f admin.log | grep -v "Nopaging the limit is" | grep -v "keyword to remove is"

1
यहां पकड़ यह है कि प्रक्रिया के बजाय जो फ़िल्टरिंग होगी, आपको एन प्रक्रियाओं को क्रमिक रूप से चलाना होगा, जहां उनमें से प्रत्येक फ़िल्टर करता है। यह चीजों को काफी धीमा कर सकता है।
आर्टेम ओबोटुरोव जुएल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.