2 विभिन्न लाइनों के लिए grep का उपयोग कैसे करें


15

जब मैं एक ही grepकमांड का उपयोग करके दो अलग-अलग पंक्तियों पर दो अलग-अलग वाक्यांशों की खोज कर सकता हूं

उदाहरण के लिए

पंक्ति १: यह एक मिठाई है।

पंक्ति 2: नींबू।

मैंने इसका इस्तेमाल किया लेकिन कोई नतीजा नहीं निकला

grep "sweet.*lemon" file_type

जवाबों:


20

grepदो अलग-अलग लाइनों के लिए उपयोग करने के लिए, दोनों पैटर्न खोजें

$ grep -e sweet -e lemon file_type
This is a sweet
lemon.

या वैकल्पिक का उपयोग करें

$ grep -E 'sweet|lemon' file_type
This is a sweet
lemon.

एक पैटर्न के बाद अगली पंक्ति प्राप्त करने के लिए, आप संदर्भ विकल्प का उपयोग कर सकते हैं

$ grep -A1 sweet file_type
This is a sweet
lemon.

लेकिन अगर आप एक बहु पैटर्न, के लिए स्पष्ट रूप से खोज कर रहे हैं कि मुश्किल वजह से grepलाइनों में सोचता है ... । आपका .*" लाइन " और "नींबू" लाइन के बीच सब कुछ पकड़ लेगा । हम साथ अगली पंक्ति "नींबू" प्राप्त कर सकते हैं -Pका उपयोग कर \nन्यू लाइन से मिलान करने और बताकर grepफ़ाइल अशक्त से अलग है -z:

$ grep -zPo 'This is a sweet\nlemon' file_type
This is a sweet
lemon.

टिप्पणियाँ:

  • -Eविस्तारित नियमित अभिव्यक्तियों का उपयोग करें ( |इसे भागने की आवश्यकता के बिना वर्ण के लिए वर्ण का उपयोग करने के लिए )
  • -An पैटर्न के बाद अतिरिक्त लाइनें प्रिंट करें, जहां n को प्रिंट करने के लिए अनुगामी लाइनों की संख्या है
  • -Pपर्ल-स्टाइल रेग्युलर एक्सप्रेशंस ("प्रायोगिक" का उपयोग करें grep- pcregrepबेहतर पर्ल रेगेक्स समर्थन के लिए स्थापित करें )
  • -z अशक्त चरित्र को विभाजक के रूप में उपयोग करें (सिर्फ इस मामले में दिखावा, लेकिन grep इसके लिए हमारा शब्द लेंगे)
  • -o केवल मिलान किए गए भाग को प्रिंट करें

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

हाँ, यह केवल -o... के साथ उपयोगी है ... संपादित करें
Zanna

यदि यह अन्य डिस्ट्रोस पर आजमाया जाता है, तो आपका सामना हो सकता है: grep: The -P and -z options cannot be combined- उदाहरण के लिए grep (GNU grep) 2.5.1 RHEL पर
जेसन पीरॉन सेप

6

ऐशे ही:

grep "sweet\|lemon"

क्षमा करें, लेकिन यह सटीक "मीठा | नींबू" से मेल
खाएगा

4
@ कासिया इस लाइन का काम ठीक है। grep"मानक मोड" में डिफ़ॉल्ट काम करता है, जहां "विशेष वर्ण" की तरह से |, +, *सचमुच में व्याख्या कर रहे हैं , जब तक कि वे एक बैकस्लैश के साथ नकाबपोश कर रहे हैं। उदाहरण के लिए देखें यह उत्तर । आपके द्वारा संभवतः उपयोग किए जाने वाले तरीके का उपयोग करने के लिए, "विशेष वर्ण" को शाब्दिक रूप से व्याख्या करने के लिए मास्क करने की आवश्यकता होती है, आपको "विस्तारित मोड" ( grep -E) पर स्विच करने की आवश्यकता होती है । हो सकता है कि पागलखाने उसके जवाबों पर थोड़ा और विस्तार कर सके, उदाहरण के लिए ओपी की कोशिश क्या मेल खाती होगी ?
हेनिंग कोकरबेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.