नियमित अभिव्यक्तियों के साथ grep (और egrep) का उपयोग करना

Using Grep With Regular Expressions



यह ट्यूटोरियल बताता है कि दोनों का उपयोग कैसे करें पकड़ (तथा egrep) टी o फाइलों में टेक्स्ट को उनके सरल रूप में और जब रेगुलर एक्सप्रेशन के साथ जोड़ा जाता है। इसमें कई शामिल हैं उदाहरण तथा अभ्यास , अधिक समाधान , दर्शक को पूरा करने के लिए।

नाम पकड़ ed (और vim) कमांड g/re/p से आता है, जिसका अर्थ है वैश्विक स्तर पर किसी दिए गए रेगुलर एक्सप्रेशन की खोज करना और आउटपुट को प्रिंट (डिस्प्ले) करना।







नियमित भाव

उपयोगिताओं उपयोगकर्ता को नियमित अभिव्यक्ति से मेल खाने वाली पंक्तियों के लिए टेक्स्ट फ़ाइलों को खोजने की अनुमति देती हैं ( रेगुलर एक्सप्रेशन ) रेगुलर एक्सप्रेशन टेक्स्ट और एक या अधिक 11 विशेष वर्णों से बना एक खोज स्ट्रिंग है। एक सरल उदाहरण एक पंक्ति की शुरुआत से मेल खा रहा है।



नमूना फ़ाइल

का मूल रूप पकड़ किसी विशेष फ़ाइल या फ़ाइलों के भीतर सरल पाठ खोजने के लिए उपयोग किया जा सकता है। उदाहरणों को आज़माने के लिए, पहले नमूना फ़ाइल बनाएँ।



नीचे दिए गए टेक्स्ट को फ़ाइल में कॉपी करने के लिए नैनो या विम जैसे संपादक का उपयोग करें मेरी फाइल .





xyz
xyzde
एक्ज़ीज़्डी
डेक्सिज़
d?gxyz
xxz
xzz
xz
एक्स * जेड
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
जाइय्य्ज़

यद्यपि आप पाठ में उदाहरणों को कॉपी और पेस्ट कर सकते हैं (ध्यान दें कि दोहरे उद्धरण ठीक से कॉपी नहीं हो सकते हैं), उन्हें ठीक से सीखने के लिए कमांड को टाइप करने की आवश्यकता है।

उदाहरणों को आज़माने से पहले, नमूना फ़ाइल देखें:



$बिल्लीमेरी फाइल

सरल खोज

फ़ाइल के भीतर 'xyz' पाठ खोजने के लिए निम्नलिखित चलाएँ:

$पकड़xyz myfile

रंगों का उपयोग करना

रंग प्रदर्शित करने के लिए, -color (एक डबल हाइफ़न) का उपयोग करें या बस एक उपनाम बनाएं। उदाहरण के लिए:

$पकड़ --रंगxyz myfile

या

$उपनाम पकड़= 'पकड़--रंग'
$पकड़xyz myfile

विकल्प

के साथ उपयोग किए जाने वाले सामान्य विकल्प पकड़ कमांड में शामिल हैं:

  • -मुझे सभी लाइनें मिल जाती हैं निरपेक्ष मामले का
  • -सी गिनती पाठ में कितनी पंक्तियाँ हैं
  • -एन डिस्प्ले लाइन नंबर मिलती-जुलती पंक्तियों का
  • -एल केवल प्रदर्शन फ़ाइल नाम वह मुक़ाबला
  • -आर पुनरावर्ती उप-निर्देशिकाओं की खोज
  • -v सभी पंक्तियों का पता लगाएं नहीं पाठ युक्त

उदाहरण के लिए:

$पकड़ -मैंxyz myfile# मामले की परवाह किए बिना टेक्स्ट ढूंढें

$पकड़ -I Cxyz myfile# टेक्स्ट के साथ लाइन गिनें

$पकड़ -मेंxyz myfile# लाइन नंबर दिखाएं

एकाधिक फ़ाइलें बनाएँ

एकाधिक फ़ाइलों को खोजने का प्रयास करने से पहले, पहले कई नई फ़ाइलें बनाएं:

$फेंक दियाxyz>myfile1
$फेंक दिया -औरxyz xzz XYZ>myfile2
$फेंक दिया -औरxxx yyy>myfile3
$बिल्लीmyfile1
$बिल्लीmyfile2
$बिल्लीmyfile3

एकाधिक फ़ाइलें खोजें

फ़ाइल नाम या वाइल्डकार्ड का उपयोग करके एकाधिक फ़ाइलों को खोजने के लिए दर्ज करें:

$पकड़ -I Cxyz myfile myfile1 myfile2 myfile3
$पकड़ -मेंxyz my*
# 'my' से शुरू होने वाले फ़ाइल नामों का मिलान करें

व्यायाम I

  1. पहले गिनें कि फाइल में कितनी लाइनें हैं /etc/passwd.
संकेत: उपयोग करेंस्वागत -NS /आदि/पासवर्ड
  1. अब पाठ की सभी घटनाओं को खोजें कहां फ़ाइल में /etc/passwd .
  2. पता लगाएं कि फ़ाइल में कितनी पंक्तियों में टेक्स्ट है
  3. पता लगाएं कि कितनी पंक्तियों में टेक्स्ट नहीं है कहां .
  4. में अपने लॉगिन के लिए प्रविष्टि खोजें /आदि/पासवार्ड

व्यायाम समाधान इस लेख के अंत में पाए जा सकते हैं।

नियमित अभिव्यक्तियों का उपयोग करना

आदेश पकड़ खोज को परिष्कृत करने के लिए ग्यारह विशेष वर्णों या प्रतीकों में से एक या अधिक का उपयोग करके नियमित अभिव्यक्तियों के साथ भी उपयोग किया जा सकता है। रेगुलर एक्सप्रेशन एक वर्ण स्ट्रिंग है जिसमें उपयोगिताओं के भीतर पैटर्न मिलान की अनुमति देने के लिए विशेष वर्ण शामिल होते हैं जैसे कि पकड़ , मैं आया तथा एसईडी . ध्यान दें कि स्ट्रिंग्स को उद्धरणों में संलग्न करने की आवश्यकता हो सकती है।

उपलब्ध विशेष पात्रों में शामिल हैं:

^ एक पंक्ति की शुरुआत
$ एक पंक्ति का अंत
. कोई भी वर्ण ( न्यूलाइन को छोड़कर)
* पिछली अभिव्यक्ति का 0 या अधिक
एक प्रतीक के आगे आने से यह एक शाब्दिक चरित्र बन जाता है

ध्यान दें कि *, जिसका उपयोग कमांड लाइन पर किसी भी वर्ण सहित किसी भी संख्या से मेल खाने के लिए किया जा सकता है, is नहीं यहां उसी तरह इस्तेमाल किया।

निम्नलिखित उदाहरणों में उद्धरणों के उपयोग पर भी ध्यान दें।

उदाहरण

^ वर्ण का उपयोग करके टेक्स्ट से शुरू होने वाली सभी पंक्तियों को खोजने के लिए:

$पकड़'^ xyz' मायफाइल

$ वर्ण का उपयोग करके टेक्स्ट के साथ समाप्त होने वाली सभी पंक्तियों को खोजने के लिए:

$पकड़'xyz$' मायफाइल

^ और $ दोनों वर्णों का उपयोग करके स्ट्रिंग वाली पंक्तियों को खोजने के लिए:

$पकड़'^xyz$' मायफाइल

का उपयोग करके लाइनें खोजने के लिए . किसी भी वर्ण से मेल खाने के लिए:

$पकड़'^x.z' मायफाइल

पिछली अभिव्यक्ति के 0 या अधिक से मेल खाने के लिए * का उपयोग करके लाइनें खोजने के लिए:

$पकड़'^ xy*जेड 'माईफाइल'

किसी भी वर्ण के 0 या अधिक का मिलान करने के लिए .* का उपयोग करके पंक्तियाँ ढूँढ़ने के लिए:

$पकड़'^ एक्स.*जेड 'माईफाइल'

का उपयोग करके लाइनें खोजने के लिए * चरित्र से बचने के लिए:

$पकड़'^ एक्स *जेड 'माईफाइल'

वर्ण उपयोग खोजने के लिए:

$पकड़'\' मेरी फाइल

अभिव्यक्ति grep - egrep

NS पकड़ कमांड उपलब्ध रेगुलर एक्सप्रेशन के केवल एक सबसेट का समर्थन करता है। हालांकि, कमांड ईग्रेप:

  • सभी नियमित अभिव्यक्तियों के पूर्ण उपयोग की अनुमति देता है
  • एक साथ एक से अधिक व्यंजक खोज सकते हैं

ध्यान दें कि भावों को उद्धरणों की एक जोड़ी के भीतर संलग्न किया जाना चाहिए।

रंगों का उपयोग करने के लिए, -color का उपयोग करें या फिर से एक उपनाम बनाएं:

$उपनाम एग्रेप='ईग्रेप --रंग'

एक से अधिक खोजने के लिए regex NS एग्रेप कमांड को कई पंक्तियों में लिखा जा सकता है। हालाँकि, यह इन विशेष वर्णों का उपयोग करके भी किया जा सकता है:

| प्रत्यावर्तन, या तो एक या दूसरे
(...) व्यंजक के भाग का तार्किक समूहन
$एग्रेप '(^root|^uucp|^mail)' /आदि/पासवर्ड

यह उन पंक्तियों को निकालता है जो फ़ाइल से रूट, uucp या मेल से शुरू होती हैं, | किसी भी विकल्प का प्रतीक अर्थ।

निम्न आदेश होगा नहीं काम, हालांकि कोई संदेश प्रदर्शित नहीं होता है, क्योंकि मूल पकड़ आदेश सभी नियमित अभिव्यक्तियों का समर्थन नहीं करता है:

$पकड़ '(^root|^uucp|^mail)' /आदि/पासवर्ड

हालांकि, अधिकांश लिनक्स सिस्टम पर कमांड ग्रेप-ई उपयोग करने के समान है एग्रेप :

$पकड़ -तथा '(^root|^uucp|^mail)' /आदि/पासवर्ड

फिल्टर का उपयोग करना

पाइपलाइन एक कमांड के आउटपुट को दूसरे कमांड में इनपुट के रूप में भेजने की प्रक्रिया है और यह उपलब्ध सबसे शक्तिशाली लिनक्स टूल्स में से एक है।

पाइपलाइन में दिखाई देने वाले कमांड को अक्सर फिल्टर के रूप में संदर्भित किया जाता है क्योंकि कई मामलों में वे संशोधित स्ट्रीम को मानक आउटपुट में भेजने से पहले उन्हें दिए गए इनपुट को छानते या संशोधित करते हैं।

निम्नलिखित उदाहरण में, से मानक आउटपुट एलएस -एल को मानक इनपुट के रूप में पारित किया जाता है पकड़ आदेश। से आउटपुट पकड़ कमांड को इनपुट के रूप में पास किया जाता है अधिक आदेश।

यह केवल निर्देशिकाओं को प्रदर्शित करेगा /आदि :

$रास -NS /आदि|पकड़'^ डी'|अधिक

निम्नलिखित कमांड फिल्टर का उपयोग करने के उदाहरण हैं:

$पी.एस. -ईएफ|पकड़क्रॉन

$who|पकड़केडीएम

नमूना फ़ाइल

समीक्षा अभ्यास का प्रयास करने के लिए, पहले निम्न नमूना फ़ाइल बनाएं।

नीचे दिए गए टेक्स्ट को फ़ाइल में कॉपी करने के लिए नैनो या विम जैसे संपादक का उपयोग करें लोग:

व्यक्तिगत जे.स्मिथ 25000
व्यक्तिगत ई.स्मिथ 25400
प्रशिक्षण ए.भूरा 27500
प्रशिक्षण सी.ब्राउन २३४००
(व्यवस्थापक) आर.ब्रॉन ३०५००
गुडसाउट टी.स्मिथ 30000
व्यक्तिगत एफ.जोन्स 25000
प्रशिक्षण* सी.इवांस 25500
गुडसाउट डब्ल्यू.पोप ३०४००
ग्राउंडफ्लोर T.Smythe 30500
व्यक्तिगत जे.मेलर 33000

व्यायाम II

  1. फ़ाइल प्रदर्शित करें लोग और इसकी सामग्री की जांच करें।
  2. स्ट्रिंग वाली सभी पंक्तियों को खोजें लोहार फ़ाइल में लोग। संकेत: कमांड का उपयोग करें grep लेकिन याद रखें कि डिफ़ॉल्ट रूप से, यह केस सेंसिटिव है।
  3. एक नई फ़ाइल बनाएँ, nPeople, जिसमें स्ट्रिंग से शुरू होने वाली सभी पंक्तियाँ हों निजी लोगों की फ़ाइल में। संकेत: कमांड grep का उपयोग > के साथ करें।
  4. फ़ाइल को सूचीबद्ध करके लोगों की फ़ाइल की सामग्री की पुष्टि करें।
  5. अब उन सभी पंक्तियों को जोड़ें जहां टेक्स्ट स्ट्रिंग के साथ समाप्त होता है 500 फ़ाइल में लोग फ़ाइल में npeople.Hint: कमांड grep का उपयोग >> के साथ करें।
  6. फिर से, फ़ाइल को सूचीबद्ध करके फ़ाइल npeople की सामग्री की पुष्टि करें।
  7. सर्वर का आईपी पता खोजें जो फ़ाइल में संग्रहीत है /आदि/मेजबान संकेत: $(hostname) के साथ grep कमांड का उपयोग करें
  8. उपयोग एग्रेप से निकालने के लिए /आदि/पासवार्ड फ़ाइल खाता लाइनें जिसमें एल.पी. या आपका अपना यूज़र आईडी .

व्यायाम समाधान इस लेख के अंत में पाए जा सकते हैं।

अधिक नियमित अभिव्यक्ति

स्टेरॉयड पर वाइल्डकार्ड के रूप में एक नियमित अभिव्यक्ति के बारे में सोचा जा सकता है।

विशेष अर्थ वाले ग्यारह वर्ण हैं: उद्घाटन और समापन वर्ग कोष्ठक [ ], बैकस्लैश , कैरेट ^, डॉलर चिह्न $, अवधि या बिंदु।, लंबवत बार या पाइप प्रतीक |, प्रश्न चिह्न?, तारक या तारा *, धन चिह्न + और उद्घाटन और समापन गोल कोष्ठक { }। इन विशेष पात्रों को अक्सर मेटाएक्टैक्टर भी कहा जाता है।

यहाँ विशेष पात्रों का पूरा सेट है:

^ एक पंक्ति की शुरुआत
$ एक पंक्ति का अंत
. कोई भी वर्ण ( न्यूलाइन को छोड़कर)
* पिछली अभिव्यक्ति का 0 या अधिक
| प्रत्यावर्तन, या तो एक या दूसरे
[…] मिलान करने के लिए वर्णों का स्पष्ट सेट
+ पिछली अभिव्यक्ति का 1 या अधिक
? पिछली अभिव्यक्ति का 0 या 1
एक प्रतीक के आगे आने से यह एक शाब्दिक चरित्र बन जाता है
{...} स्पष्ट क्वांटिफायर नोटेशन
(...) व्यंजक के भाग का तार्किक समूहन

का डिफ़ॉल्ट संस्करण पकड़ केवल सीमित नियमित अभिव्यक्ति समर्थन है। निम्नलिखित सभी उदाहरणों के काम करने के लिए, उपयोग करें एग्रेप इसके बजाय या ग्रेप-ई .

का उपयोग करके लाइनें खोजने के लिए | किसी भी अभिव्यक्ति से मेल खाने के लिए:

$एग्रेप'xxz|xzz' myfile

| . का उपयोग करके लाइनें खोजने के लिए एक स्ट्रिंग के भीतर किसी भी अभिव्यक्ति से मेल खाने के लिए भी ( ) का उपयोग करें:

$एग्रेप'^ एक्स(यज़ू|यज़ी)' मेरी फाइल

किसी भी वर्ण से मेल खाने के लिए [] का उपयोग करके रेखाएँ ढूँढ़ने के लिए:

$एग्रेप'^ एक्स[Y y]जेड 'माईफाइल'

किसी भी वर्ण से मेल नहीं खाने के लिए [] का उपयोग करके लाइनें खोजने के लिए:

$एग्रेप'^ एक्स[^ यी]जेड 'माईफाइल'

पिछली अभिव्यक्ति के 0 या अधिक से मेल खाने के लिए * का उपयोग करके लाइनें खोजने के लिए:

$एग्रेप'^ xy*जेड 'माईफाइल'

पिछली अभिव्यक्ति के 1 या अधिक से मेल खाने के लिए + का उपयोग करके लाइनें खोजने के लिए:

$एग्रेप'^xy+z' मायफाइल

का उपयोग कर लाइनों को खोजने के लिए? पिछली अभिव्यक्ति के 0 या 1 से मेल खाने के लिए:

$एग्रेप'^xy?z' मायफाइल

व्यायाम III

  1. नामों वाली सभी पंक्तियों को खोजें इवांस या चित्रकार फ़ाइल में लोग।
  2. नामों वाली सभी पंक्तियों को खोजें स्मिथ, स्मिथ या स्माइथे फ़ाइल में लोग।
  3. नामों वाली सभी पंक्तियों को खोजें ब्राउन, ब्राउन या स्रोत फ़ाइल में लोग। यदि आपके पास समय है:
  4. स्ट्रिंग युक्त रेखा खोजें (व्यवस्थापक), फ़ाइल लोगों में कोष्ठक सहित।
  5. फ़ाइल लोगों में * वर्ण वाली रेखा खोजें।
  6. उपरोक्त 5 और 6 को मिलाकर दोनों व्यंजक ज्ञात कीजिए।

और ज्यादा उदाहरण

लाइनों का उपयोग करने के लिए . और * वर्णों के किसी भी सेट से मेल खाने के लिए:

$एग्रेप'^ xy.*जेड 'माईफाइल'

N वर्णों की संख्या से मिलान करने के लिए { } का उपयोग करके पंक्तियाँ ढूँढ़ने के लिए:

$एग्रेप'^ xy{3}जेड 'माईफाइल'
$एग्रेप'^ xy{4}जेड 'माईफाइल'

N या ​​अधिक बार मिलान करने के लिए { } का उपयोग करके लाइनें ढूंढने के लिए:

$एग्रेप'^ xy{3,}जेड 'माईफाइल'

{ } का उपयोग करके N बार लेकिन M बार से अधिक नहीं मिलान करने के लिए लाइनों को खोजने के लिए:

$एग्रेप'^ xy{2,3}जेड 'माईफाइल'

निष्कर्ष

इस ट्यूटोरियल में हमने पहली बार उपयोग करने पर ध्यान दिया पकड़ फ़ाइल में या एकाधिक फ़ाइलों में टेक्स्ट खोजने के लिए यह सरल रूप में है। फिर हमने खोजे जाने वाले टेक्स्ट को साधारण रेगुलर एक्सप्रेशन के साथ संयोजित किया और फिर अधिक जटिल व्यंजकों का उपयोग करके एग्रेप .

अगला कदम

मुझे आशा है कि आप यहां प्राप्त ज्ञान का सदुपयोग करेंगे। कोशिश करें पकड़ अपने स्वयं के डेटा पर आदेश और याद रखें, यहां वर्णित नियमित अभिव्यक्तियों का उपयोग उसी रूप में किया जा सकता है हम , एसईडी तथा awk !

व्यायाम समाधान

व्यायाम I

पहले गिनें कि फाइल में कितनी लाइनें हैं /आदि/पासवार्ड .
$ wc -l /etc/passwd
अब पाठ की सभी घटनाओं को खोजें कहां फ़ाइल में /etc/passwd.
$ grep var /etc/passwd
पता लगाएं कि फ़ाइल में कितनी पंक्तियों में टेक्स्ट है कहां

पकड़ -सीकहां/आदि/पासवर्ड

पता लगाएं कि कितनी पंक्तियों में टेक्स्ट नहीं है कहां .

पकड़ -सीवीकहां/आदि/पासवर्ड

में अपने लॉगिन के लिए प्रविष्टि खोजें /आदि/पासवार्ड फ़ाइल
grep kdm /etc/passwd

व्यायाम II

फ़ाइल प्रदर्शित करें लोग और इसकी सामग्री की जांच करें।
$ cat people
स्ट्रिंग वाली सभी पंक्तियों को खोजें लोहार फ़ाइल में लोग .
$ grep 'Smith' people
एक नई फ़ाइल बनाएँ, लोग , जिसमें स्ट्रिंग से शुरू होने वाली सभी लाइनें शामिल हैं निजी में लोग फ़ाइल
$ grep '^Personal' people> npeople
फ़ाइल की सामग्री की पुष्टि करें लोग फ़ाइल को सूचीबद्ध करके।
$ cat npeople
अब उन सभी पंक्तियों को जोड़ें जहां टेक्स्ट स्ट्रिंग के साथ समाप्त होता है 500 फ़ाइल में लोग फ़ाइल के लिए लोग .
$ grep '500$' people>>npeople
फिर से, फ़ाइल की सामग्री की पुष्टि करें लोग फ़ाइल को सूचीबद्ध करके।
$ cat npeople
सर्वर का आईपी पता खोजें जो फ़ाइल में संग्रहीत है /आदि/मेजबान .
$ grep $(hostname) /etc/hosts
उपयोग एग्रेप से निकालने के लिए /आदि/पासवार्ड फ़ाइल खाता लाइनें जिसमें एल.पी. या अपनी खुद की यूजर आईडी।
$ egrep '(lp|kdm:)' /etc/passwd

व्यायाम III

नामों वाली सभी पंक्तियों को खोजें इवांस या चित्रकार फ़ाइल में लोग .
$ egrep 'Evans|Maler' people
नामों वाली सभी पंक्तियों को खोजें लोहार , स्मिथ या स्माइथे फ़ाइल में लोग .
$ egrep 'Sm(i|y)the?' people
नामों वाली सभी पंक्तियों को खोजें भूरा , ब्राउन या स्रोत फ़ाइल में लोग।
$ egrep 'Brow?e?n' people
स्ट्रिंग युक्त रेखा खोजें (व्यवस्थापक), कोष्ठक सहित, फ़ाइल में लोग .

$एग्रेप '(व्यवस्थापक)'लोग

चरित्र वाली रेखा खोजें * फ़ाइल में लोग।
$ egrep '*' people
उपरोक्त 5 और 6 को मिलाकर दोनों व्यंजक ज्ञात कीजिए।

$एग्रेप '(व्यवस्थापक)|*'लोग