इसके लिए grep का उपयोग करने का प्रयास न करें, इसके बजाय awk का उपयोग करें। 2 regexps R1 और R2 को grep में मिलाने के लिए आपको लगता है कि यह होगा:
grep 'R1.*R2|R2.*R1'
जागते समय यह होगा:
awk '/R1/ && /R2/'
लेकिन क्या होगा अगर R2
एक सबसेट के साथ या ओवरलैप हो जाए R1
? उस grep कमांड बस काम नहीं करेगा जबकि awk कमांड होगा। कहते हैं कि आप उन पंक्तियों को खोजना चाहते हैं जिनमें शामिल हैं the
और heat
:
$ echo 'theatre' | grep 'the.*heat|heat.*the'
$ echo 'theatre' | awk '/the/ && /heat/'
theatre
आपको इसके लिए 2 greps और एक पाइप का उपयोग करना होगा:
$ echo 'theatre' | grep 'the' | grep 'heat'
theatre
और निश्चित रूप से अगर आपने वास्तव में उन्हें अलग करने की आवश्यकता की थी, तो आप हमेशा उसी regexp को awk में लिख सकते हैं जैसा कि आपने grep में उपयोग किया था और वैकल्पिक awk समाधान हैं जो regexps को हर संभव अनुक्रम में दोहराना शामिल नहीं करते हैं।
इसे एक तरफ रखते हुए, क्या होगा यदि आप 3 रेगेक्स आर 1, आर 2, और आर 3 से मेल खाने के लिए अपने समाधान का विस्तार करना चाहते हैं। इन गरीब विकल्पों में से एक grep में:
grep 'R1.*R2.*R3|R1.*R3.*R2|R2.*R1.*R3|R2.*R3.*R1|R3.*R1.*R2|R3.*R2.*R1' file
grep R1 file | grep R2 | grep R3
जागते समय यह संक्षिप्त, स्पष्ट, सरल, कुशल होगा:
awk '/R1/ && /R2/ && /R3/'
अब, क्या होगा यदि आप वास्तव में regexps R1 और R2 के बजाय शाब्दिक तार S1 और S2 से मेल खाना चाहते हैं? आप बस ऐसा नहीं कर सकते हैं कि एक कॉल में grep करने के लिए, आपको कॉल करने से पहले सभी RE मेटाचर्स से बचने के लिए कोड लिखना होगा:
S1=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R1')
S2=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R2')
grep 'S1.*S2|S2.*S1'
या फिर 2 greps और एक पाइप का उपयोग करें:
grep -F 'S1' file | grep -F 'S2'
जो फिर से खराब विकल्प हैं जबकि awk के साथ आप बस regexp ऑपरेटर के बजाय एक स्ट्रिंग ऑपरेटर का उपयोग करते हैं:
awk 'index($0,S1) && index($0.S2)'
अब, क्या होगा अगर आप एक पंक्ति के बजाय एक पैराग्राफ में 2 रेगेक्स से मिलान करना चाहते हैं? Grep में नहीं किया जा सकता, awk में तुच्छ:
awk -v RS='' '/R1/ && /R2/'
कैसे एक पूरी फ़ाइल के बारे में? फिर से awk में grep और तुच्छ नहीं किया जा सकता है (इस समय मैं GNU awk का उपयोग मल्टी-चार RS के लिए संक्षिप्तता के लिए कर रहा हूं, लेकिन यह किसी भी awk में अधिक कोड नहीं है या आप नियंत्रण-चार चुन सकते हैं जिसे आप नहीं जानते हैं रुपये के लिए इनपुट में ही हो)
awk -v RS='^$' '/R1/ && /R2/'
इसलिए - यदि आप एक पंक्ति या पैराग्राफ या फ़ाइल में कई regexps या तार ढूंढना चाहते हैं तो grep का उपयोग न करें, awk का उपयोग करें।