ग्रीप मल्टीपल पैटर्न निगेटिव मैच


14

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

तो चलिए बताते हैं कि मेरे पास प्रविष्टियों की तरह एक फ़ाइल robot_patterns है

Googlebot
msnbot-media
YandexBot
bingbot

अगर मैं कमांड चलाता हूं तो मुझे grep -f robot_patterns *.logउपरोक्त पैटर्न से मेल खाते बॉट्स द्वारा सभी प्रविष्टियां मिलेंगी। मेरी वास्तविक सूची में बॉट और एजेंटों की ~ 30 प्रविष्टियाँ हैं जिन्हें मैं अनदेखा करना चाहता हूँ।

लेकिन मैं उन सभी प्रविष्टियों को खोजना चाहता हूं जो बॉट्स से नहीं हैं । इसलिए मैं कोशिश करता हूं grep -v -f robot_patterns *.logऔर कोई परिणाम जीआरपी द्वारा वापस नहीं किया जाता है। यह वह नहीं है जो मैं उम्मीद करता हूं या इच्छा करता हूं, और मुझे जो चाहिए वह पाने के लिए एक स्पष्ट रास्ता नहीं मिल रहा है। -vकिसी फ़ाइल में कई पैटर्नों के साथ संयुक्त विकल्प का उपयोग करते समय, grep केवल एक मिलान रेखा लौटाएगा यदि यह हर पैटर्न से मेल खाता है।


जब मैंने अपने सिस्टम पर यह कोशिश की, grep -v -f का वांछित व्यवहार था, केवल रिटर्निंग लाइनें जो किसी भी पैटर्न से मेल नहीं खाती थीं। यह (GNU grep) 2.14.56-1e3d के साथ था। आप किस grep का उपयोग कर रहे हैं?
विंग्डशूबमारिनर

मैं दौड़ रहा हूं GNU grep 2.6.3
ज़ोराडेक

4
मैंने कुछ और परीक्षण किए, और पाया कि अगर पैटर्न फ़ाइल में एक खाली लाइन है तो यह हर लाइन से मेल खाएगी, जिससे कोई भी लाइन -v के साथ वापस नहीं आएगी। यह हालांकि, -F के साथ कोई समस्या नहीं है, और -F आपके काम के लिए grep को तेज कर सकता है - आपके लिए प्रयास करने लायक हो सकता है।
विंगडसुम्ब्रेनर

एक अनुगामी खाली रेखा! अर्घ ... यह मुद्दा लगता है। यदि आप चाहते हैं, तो आपको उत्तर के रूप में जोड़ना चाहिए।
ज़ॉडेचेस

जवाबों:


8

अगर पैटर्न फाइल में एक खाली लाइन है तो यह हर लाइन से मेल खाएगी, जिससे कोई भी लाइन वापस नहीं आएगी -v। इसका कारण यह है कि लाइनों को नियमित अभिव्यक्ति के रूप में व्याख्या की जाती है, और एक खाली नियमित अभिव्यक्ति हमेशा मेल खाती है।

यह -Fहालांकि के साथ एक समस्या नहीं है , क्योंकि के grepसाथ खाली लाइनों की अनदेखी करता है -F
-Fकारणों grepकी व्याख्या करने के लिए सरल स्ट्रिंग्स के रूप में व्याख्या करने का कारण बनता है और grepयदि नियमित अभिव्यक्ति की आवश्यकता नहीं है, तो गति हो सकती है ।


1
जीएनयू fgrepअनदेखी कि रिक्त स्ट्रिंग अनुगामी एक बग कि 2.19 (में तय किया गया था 2d3832e1ff772dc1a374bfad5dcc1338350cc48b प्रतिबद्ध है, तो आप उस पर निर्भर नहीं होना चाहिए।
स्टीफन Chazelas

13

तुम कोशिश कर सकते हो:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
यूनिक्स और लिनक्स में आपका स्वागत है। ओपी के पास लगभग 30 तारों की एक सूची है जिसे वह नजरअंदाज करना चाहता है, और जिन चार को उसने उदाहरण के रूप में प्रस्तुत किया है उनमें प्रत्येक में औसतन दस वर्ण हैं, इसलिए आपकी आज्ञा 300 से अधिक वर्णों की होने की संभावना है। यह बनाए रखने के लिए कठिन होने की संभावना है (और यहां तक ​​कि पढ़ने के लिए)। क्या आप ओपी के तार की सूची से प्रेरित होने के लिए अपने जवाब को संशोधित कर सकते हैं? ………………………………………… क्या आपने देखा कि जवाब मिल गया है? - ओपी ने सीखा है कि काम करने के लिए अपने मूल दृष्टिकोण को कैसे प्राप्त करें।
जी-मैन का कहना है कि 'मोनिका'

2
मेरी प्रतिक्रिया का नकारात्मक मूल्यांकन क्यों करें? : /
ऑर्टियस

3
बहुत बढ़िया जवाब। Regex OR और -vE विकल्प मददगार था।
कीर्ति कार्सन

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