Grep का उपयोग करते हुए नकारात्मक मिलान (मिलान रेखाएँ जिसमें foo नहीं है)


988

मैं इस कमांड के लिए सिंटैक्स का काम करने की कोशिश कर रहा हूं:

grep ! error_log | find /home/foo/public_html/ -mmin -60

या:

grep '[^error_log]' | find /home/baumerf/public_html/ -mmin -60

मुझे उन सभी फ़ाइलों को देखने की आवश्यकता है जिन्हें नामांकित लोगों के अलावा संशोधित किया गया है error_log

मैंने इसके बारे में यहां पढ़ा है , लेकिन केवल एक not-regex पैटर्न पाया है ।


13
[^ error_log] कभी भी किसी भी तरह से काम नहीं करेगा, [] चार वर्ग हैं, सामान्य तौर पर regexp के नकारात्मक पैटर्न अच्छे नहीं होते हैं (जब तक कि इंजन नकारात्मक लुकहेड को लागू नहीं करता है)।
जाप

जवाबों:


1754

grep -v आपका दोस्त है:

grep --help | grep invert  

-v, --invert- मैच नॉन-मैचिंग लाइनों का चयन करें

इसके अलावा संबंधित -L(पूरक -l) देखें।

-L, --files-without-match केवल प्रिंट करें FILE नाम जिसमें कोई मेल न हो


124
वर्थ का उल्लेख करते हुए कि कई (नकारात्मक) मैचों के -eविकल्प का उपयोग किया जा सकता है:grep -v -e 'negphrase1' -e 'negphrase2'
बबकेन वर्दयान

31
@ Babken-Vardanyan से टिप्पणी के समान - कई मैचों में शामिल होने के लिए पाइप का उपयोग करने में सक्षम जैसेgrep -v 'negphrase1|negphrase2|negphrase3'
निकोलस एडम्स

13
अंतिम टिप्पणी समान नहीं है क्योंकि यह उन चीजों की खोज करेगी जो दोनों के बजाय दोनों से मेल नहीं खाती हैं। यानी अगर यह एक से मेल खाता है, लेकिन दूसरा इसका अभी भी मुद्रित नहीं है। इसे गैर-समान स्ट्रिंग्स के साथ दोनों तरीकों से आज़माएं
इवान लैंग्लिस

7
@EvanLanglois - काम करने के लिए एक विस्तारित नियमित अभिव्यक्ति के रूप में पैटर्न की व्याख्या करने के लिए grep मजबूर कर रहा -Eहै, अर्थात् grep -vE 'negphrase1|negphrase2|negphrase3'
18

1
@ OlleHärstedt, मुझे लगता है कि मैंने अपनी पिछली टिप्पणी में आपके परिदृश्य को गलत समझा, निम्नलिखित वह हो सकता है जो आप खोज रहे हैं grep "" /dev/null * | grep foo | grep -v bar | cut -d: -f1 | sort -u( पहली grep क्यों ? , वहाँ हमेशा एक तरीका है :))
Motti

139

आप awkइन उद्देश्यों के लिए भी उपयोग कर सकते हैं, क्योंकि यह आपको अधिक स्पष्ट तरीके से अधिक जटिल जांच करने की अनुमति देता है:

युक्त लाइनें foo:

awk '!/foo/'

न तो वाली लाइनें fooऔर न ही bar:

awk '!/foo/ && !/bar/'

न युक्त लाइन्स fooऔर न ही barजो या तो शामिल foo2या bar2:

awk '!/foo/ && !/bar/ && (/foo2/ || /bar2/)'

और इसी तरह।


2
यह वास्तव में काफी अच्छा है। तार्किक ऑपरेटरों के साथ समूह regexp के क्रम में आपको संपूर्ण awk भाषा सीखने की भी आवश्यकता नहीं है। इस उत्तर के लिए धन्यवाद!
पीटर टी।

1
वास्तव में मैं क्या देख रहा था, बहुत बहुत धन्यवाद।
mmrs151

13

आपके मामले में, आप संभवतः grep का उपयोग नहीं करना चाहते हैं, लेकिन इसके बजाय एक कमांड को खोजने के लिए एक नकारात्मक खंड जोड़ें, उदा

find /home/baumerf/public_html/ -mmin -60 -not -name error_log

यदि आप वाइल्डकार्ड को नाम में शामिल करना चाहते हैं, तो आपको उन्हें बचाना होगा, उदाहरण के लिए प्रत्यय के साथ फाइलों को बाहर करना होगा।

find /home/baumerf/public_html/ -mmin -60 -not -name \*.log
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.