तर्क ऑपरेटरों के साथ grep


19

क्या एक grep जैसी उपयोगिता है जो मुझे तर्क ऑपरेटरों के साथ grep खोज करने में सक्षम करेगी। मैं तार्किक निर्माणों को स्वतंत्र रूप से घोंसला बनाने और संयोजित करने में सक्षम होना चाहता हूं। उदाहरण के लिए, इस तरह से सामान संभव होना चाहिए:

grep (term1 && term2) || (term1 && (term3 xor term4)) *

मुझे लगता है कि यह वेनिला grep और अतिरिक्त बैश स्क्रिप्टिंग के साथ किया जा सकता है, लेकिन यहाँ मेरा लक्ष्य ऐसा करने से बचना है।

grep 

जवाबों:


12

साथ awk, साथ के रूप में perl, आप में मामले रैप करने के लिए होगा //, लेकिन यह किया जा सकता है:

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

grepतार्किक ऑपरेटरों के साथ उपयोग करने के बहुत सारे तरीके हैं ।

  1. OR स्थिति के \|लिए कई पैटर्न अलग करने के लिए उपयोग करें ।

    उदाहरण: grep 'pattern1\|pattern2' filename

  2. OR स्थिति के -Eलिए कई पैटर्न भेजने के लिए विकल्प का उपयोग करें ।

    उदाहरण: grep -E 'pattern1|pattern2' filename

  3. एक एकल -eमैच का उपयोग केवल एक पैटर्न से होता है, लेकिन कई -eविकल्प का उपयोग करना एक पैटर्न से अधिक मेल खाता है।

    उदाहरण: grep -e pattern1 -e pattern2 filename

  4. grep -vनहीं ऑपरेशन का अनुकरण कर सकते हैं ।

  5. इसमें कोई AND ऑपरेटर नहीं है grep, लेकिन आप विकल्प का उपयोग करके और अनुकरण कर सकते हैं -E

    उदाहरण : grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    उपरोक्त उदाहरण उन सभी रेखाओं से मेल खाएगा जिनमें पैटर्न 1 और पैटर्न 2 दोनों किसी भी क्रम में हों।)


1
-E&&इस तथ्य के कारण काफी समतुल्य नहीं है कि यह आदेश-संवेदनशील है
इरुवर

grep foo | grep barऔर अधिक सामान्य तरीका है।
केनस्टर

2
+1 स्पष्ट रूप से समझाने के लिए कि कोई वास्तविक "और" ऑपरेटर नहीं है, और हम जो सबसे अच्छा कर सकते हैं वह एक OR संरचना का उपयोग करके हैक को अनुकरण करना है। यह निश्चित रूप से 3 से अधिक शब्दों के साथ अपरिवर्तित मिलेगा, लेकिन दो शब्दों के लिए यह अच्छी तरह से काम करता है।
एरिक हेपरले - कोडस्लाइयर २०१०

grep -c -e MATCH1 -E MATCH2 बहुत अच्छा है जब आप फ़ाइल नाम की गिनती में रुचि रखते हैं।
andrej

4

आप पर्ल का उपयोग कर सकते हैं:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

मेरा मानना ​​है कि आप जो करने की कोशिश कर रहे हैं उसे पूरा करता है। यह dआउटपुट से किसी भी लाइन से मेल खाता है जो मेल नहीं खाता है term1, यह bस्क्रिप्ट से बाहर भागता है (और इसलिए ऑटोप्रिन्ट) किसी भी लाइन जो बनी हुई है और जो मेल खाती है term2, और जो लाइनें बची रहती हैं , वह किसी से भी डिलीट हो जाती हैं जो मेल नहीं खाती हैं और जो मैच करती हैं term3उनमें सेterm4

sed लिपियों का मूल्यांकन क्रम में किया जाता है, और सभी परीक्षण बूलियन होते हैं, इसलिए परीक्षण के परिणामस्वरूप होने वाली कोई भी कार्रवाई किसी भी निम्नलिखित कार्यों के व्यवहार को सीधे प्रभावित करने वाली है।


0

मैं grepएक तार्किक और प्राप्त करने के लिए चेन कमांड का उपयोग करता हूं :

grep expr1 filename | grep expr2

मेरा मानना ​​है कि यह बहुत सीधा, यूनिक्स जैसा और सुरुचिपूर्ण है।


तब आप -EOR-ing के विकल्प के साथ (नकारने के लिए @Tushi अच्छी तरह से समझाया गया) जोड़ सकते हैं -v

आपका विशिष्ट उदाहरण बहुत बुरा है और शायद कुछ अधिक शक्तिशाली उपयोगिता से लाभ होगा (@ muru का जवाब देखें)।

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