एंड्रॉयड

लिनक्स में ग्रीप कमांड (फाइलों में पाठ ढूंढें)

कहाँ ग्रेप से आया - Computerphile

कहाँ ग्रेप से आया - Computerphile

विषयसूची:

Anonim

grep कमांड जो "वैश्विक नियमित अभिव्यक्ति प्रिंट" के लिए खड़ा है, लिनक्स में सबसे शक्तिशाली और आमतौर पर इस्तेमाल किए जाने वाले कमांड में से एक है।

Grep उन लाइनों के लिए एक या एक से अधिक इनपुट फ़ाइलों की खोज करता है जो किसी दिए गए पैटर्न से मेल खाती हैं और प्रत्येक मिलान रेखा को मानक आउटपुट में लिखती हैं। यदि कोई फाइल निर्दिष्ट नहीं है, तो grep मानक इनपुट से पढ़ता है, जो आमतौर पर किसी अन्य कमांड का आउटपुट होता है।

इस ट्यूटोरियल में, हम आपको दिखाएंगे कि व्यावहारिक उदाहरणों के माध्यम से grep कमांड का उपयोग कैसे करें, और सबसे सामान्य GNU grep विकल्पों की विस्तृत व्याख्या करें।

ग्रीप कमांड सिंटेक्स

grep कमांड का उपयोग करने के तरीके में जाने से पहले, आइए मूल सिंटैक्स की समीक्षा करके शुरू करें।

grep उपयोगिता अभिव्यक्ति निम्नलिखित रूप लेती है:

grep PATTERN

वर्ग कोष्ठक में आइटम वैकल्पिक हैं।

  • OPTIONS - शून्य या अधिक विकल्प। ग्रीप कई विकल्प प्रदान करता है जो इसके व्यवहार को नियंत्रित करते हैं। PATTERN - खोज पैटर्न। FILE - शून्य या अधिक इनपुट फ़ाइल नाम।

फ़ाइल को खोजने में सक्षम होने के लिए, कमांड चलाने वाले उपयोगकर्ता को फ़ाइल तक पहुंच पढ़ना होगा।

फ़ाइलों में एक स्ट्रिंग के लिए खोज करने के लिए grep का उपयोग कैसे करें

grep कमांड का सबसे मूल उपयोग एक फ़ाइल में एक स्ट्रिंग (पाठ) की खोज करना है।

उदाहरण के लिए, स्ट्रिंग / bash वाली /etc/passwd फ़ाइल से लाइनें प्रदर्शित करने के लिए आप निम्नलिखित कमांड का उपयोग कर सकते हैं:

grep bash /etc/passwd

आउटपुट कुछ इस तरह दिखना चाहिए:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

यदि स्ट्रिंग में स्थान शामिल हैं, तो आपको इसे एकल या दोहरे उद्धरण चिह्नों में संलग्न करना होगा:

grep "Gnome Display Manager" /etc/passwd

इनवर्ट मैच (बहिष्कृत)

उन लाइनों को प्रदर्शित करने के लिए जो एक पैटर्न से मेल नहीं खाती हैं, -v (या - --invert-match ) विकल्प का उपयोग करें।

उदाहरण के लिए /etc/passwd फ़ाइल से उन पंक्तियों को प्रदर्शित करने के लिए, जिनमें स्ट्रिंग nologin नहीं है, nologin आप निम्न कमांड का उपयोग कर सकते हैं:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

कमांड आउटपुट में स्ट्रिंग की खोज करने के लिए ग्रीप का उपयोग कैसे करें

इनपुट फ़ाइलों को निर्दिष्ट करने के बजाय, आप grep लिए किसी अन्य कमांड के आउटपुट को पाइप कर सकते हैं, और फिर दिए गए पैटर्न से मेल खाते हुए लाइनों को प्रदर्शित कर सकते हैं।

उदाहरण के लिए, यह जानने के लिए कि उपयोगकर्ता www-data रूप में आपके सिस्टम पर कौन-सी प्रक्रियाएँ चला रहे हैं, आप निम्न ps कमांड का उपयोग कर सकते हैं:

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

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

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

पुनरावर्ती खोज

पैटर्न का उपयोग करने के लिए पुनरावर्ती खोज करने के लिए, -r विकल्प (या --recursive ) का उपयोग करें। यह निर्दिष्ट निर्देशिका में सभी फ़ाइलों के माध्यम से खोज करेगा, जो पुनरावृत्ति का सामना कर रहे सिम्बलिंक को छोड़ देगा। सभी प्रतीकात्मक लिंक का पालन करने के लिए, -R विकल्प (या --dereference-recursive ) का उपयोग करें।

निम्नलिखित उदाहरण में हम /etc निर्देशिका के अंदर सभी फ़ाइलों में string linuxize.com खोज कर रहे हैं:

grep -r linuxize.com /etc

कमांड फ़ाइल के लिए पूर्ण पथ द्वारा उपसर्ग मिलान लाइनों को मुद्रित करेगा।

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

यदि इसके बजाय -r उपयोग करें -R विकल्प grep सभी प्रतीकात्मक लिंक का अनुसरण करेगा:

grep -R linuxize.com /etc

आउटपुट की अंतिम पंक्ति पर ध्यान दें। वह रेखा ऊपर के उदाहरण में नहीं छपी है क्योंकि निग्नेक्स की sites-enabled निर्देशिका के अंदर की फाइलें sites-available निर्देशिका के अंदर कॉन्फ़िगरेशन फ़ाइलों के लिए सीमलिंक हैं।

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

केवल फ़ाइल नाम दिखाएँ

डिफ़ॉल्ट grep आउटपुट को दबाने और केवल मिलान किए गए पैटर्न वाली फ़ाइलों के नाम को प्रिंट करने के लिए, आप -l (या --files-with-matches ) विकल्प का उपयोग कर सकते हैं।

उदाहरण के लिए, वर्तमान कार्यशील निर्देशिका में linuxize.com साथ समाप्त होने वाली सभी फ़ाइलों को खोजने के लिए और केवल स्ट्रिंग linuxize.com युक्त फाइलों के नाम प्रिंट करें:

grep -l linuxize.com *.conf

आउटपुट कुछ इस तरह दिखाई देगा:

tmux.conf haproxy.conf

-l विकल्प आमतौर पर पुनरावर्ती विकल्प के साथ संयोजन में उपयोग किया जाता है -R :

grep -Rl linuxize.com /tmp

केस असंवेदनशील खोज

डिफ़ॉल्ट रूप से, grep कमांड संवेदनशील होता है। इसका मतलब यह है कि अपरकेस और लोअरकेस वर्णों को अलग माना जाता है।

खोज करते समय मामले को अनदेखा करने के लिए, -i विकल्प (या --ignore-case ) का उपयोग करें।

उदाहरण के लिए, बिना किसी विकल्प के Zebra खोज करते समय, निम्न कमांड कोई आउटपुट नहीं दिखाएगा अर्थात मेल खाने वाली लाइनें हैं:

grep Zebra /usr/share/words

लेकिन यदि आप -i विकल्प का उपयोग करके असंवेदनशील खोज करते हैं, तो यह ऊपरी और निचले दोनों मामलों के अक्षरों से मेल खाएगा:

grep -i Zebra /usr/share/words

"ज़ेबरा" निर्दिष्ट करना उस स्ट्रिंग के लिए "ज़ेबरा", "ज़ेब्रा" या ऊपरी और निचले मामले के अक्षरों के किसी भी अन्य संयोजन से मेल खाएगा।

zebra zebra's zebras

पूर्ण शब्दों के लिए खोजें

"ग्नू" की खोज करते समय, grep उन रेखाओं को भी प्रिंट करेगा जहाँ "ग्नू" को "साइग्नस" या "मैग्नम" जैसे बड़े शब्दों में एम्बेड किया गया है।

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

केवल उन पंक्तियों को वापस करने के लिए जहां निर्दिष्ट स्ट्रिंग एक पूरा शब्द है (गैर-शब्द वर्णों से घिरा हुआ), -w ( --word-regexp ) विकल्प का उपयोग करें।

शब्द वर्णों में अल्फ़ान्यूमेरिक वर्ण ( az , AZ और 0-9 ) और अंडरस्कोर ( _ ) शामिल हैं। अन्य सभी वर्णों को गैर-शब्द अक्षर माना जाता है।

grep -w gnu /usr/share/words

gnu

लाइन नंबर दिखाएं

उन पंक्तियों की संख्या दिखाने के लिए जिनमें एक स्ट्रिंग है जो एक पैटर्न से मेल खाती है, -n (या --line-number ) विकल्प का उपयोग करें। इस विकल्प का उपयोग करते समय, grep मैचों को उस मानक संख्या तक प्रिंट करेगा, जो उस लाइन नंबर के साथ उपसर्गित थी, जिस पर यह पाया गया था।

उदाहरण के लिए /etc/services Services फ़ाइल से लाइनों को प्रदर्शित करने के लिए जिसमें स्ट्रिंग bash का मिलान लाइन नंबर के साथ उपसर्ग किया गया है, आप निम्नलिखित लिंक का उपयोग कर सकते हैं:

grep -n 10000 /etc/services

नीचे दिए गए आउटपुट से पता चलता है कि मैच 10423 और 10424 लाइनों पर पाए जाते हैं।

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

माचिस गिनना

मानक उत्पादन के लिए मिलान लाइनों की एक संख्या को मुद्रित करने के लिए, -c (या --count ) विकल्प का उपयोग करें।

नीचे दिए गए उदाहरण में, हम उन खातों की संख्या की गिनती कर रहे हैं जिनके पास शेल के रूप में /usr/bin/zsh

grep -c '/usr/bin/zsh' /etc/passwd

4

एकाधिक स्ट्रिंग्स (पैटर्न) के लिए खोजें

OR ऑपरेटर का उपयोग करके दो या अधिक खोज पैटर्न जोड़े जा सकते हैं ।

डिफ़ॉल्ट रूप से, grep पैटर्न को एक नियमित नियमित अभिव्यक्ति के रूप में व्याख्या करता है जहाँ मेटा-वर्ण जैसे कि | अपना विशेष अर्थ खो देते हैं, और उनके बैकस्लेस्ड संस्करणों का उपयोग करना चाहिए।

नीचे दिए गए उदाहरण में हम Nginx लॉग त्रुटि फ़ाइल में fatal , error और critical शब्दों की सभी घटनाओं को खोज रहे हैं:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

शांत तरीका

-q (या --quiet ) grep को टर्मिनल (मानक आउटपुट) पर कुछ भी नहीं लिखने के लिए कहता है। यदि कोई मैच पाया जाता है, तो कमांड स्टेटस 0 से बाहर निकल जाएगा। शेल स्क्रिप्ट्स में grep का उपयोग करते समय यह उपयोगी होता है, जहाँ आप यह जाँचना चाहते हैं कि फ़ाइल में स्ट्रिंग है या नहीं और परिणाम के आधार पर एक निश्चित कार्रवाई करते हैं।

यहाँ एक शांत मोड में grep का उपयोग करने का एक उदाहरण है if एक बयान में परीक्षण कमांड के रूप में:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

बुनियादी नियमित अभिव्यक्ति

जीएनयू ग्रीप में दो नियमित अभिव्यक्ति सुविधा सेट हैं, बेसिक और विस्तारित। डिफ़ॉल्ट रूप से, grep एक नियमित नियमित अभिव्यक्ति के रूप में पैटर्न की व्याख्या करता है।

जब मूल नियमित अभिव्यक्ति मोड में उपयोग किया जाता है, तो मेटा-वर्णों को छोड़कर अन्य सभी वर्ण, वास्तव में नियमित अभिव्यक्ति होते हैं जो स्वयं से मेल खाते हैं। नीचे आमतौर पर उपयोग किए जाने वाले मेटा-पात्रों की सूची दी गई है:

  • लाइन की शुरुआत में अभिव्यक्ति से मिलान करने के लिए ^ (कैरेट) प्रतीक का उपयोग करें। निम्नलिखित उदाहरण में, स्ट्रिंग ^kangaroo केवल तभी मैच करेगा जब यह एक पंक्ति की शुरुआत में होता है।

    grep "^kangaroo" file.txt

    एक पंक्ति के अंत में अभिव्यक्ति से मेल करने के लिए $ (डॉलर) प्रतीक का उपयोग करें। निम्न उदाहरण में, स्ट्रिंग kangaroo$ केवल तभी मेल खाएगा जब यह एक पंक्ति के बहुत अंत में होता है।

    grep "kangaroo$" file.txt

    का प्रयोग करें . (अवधि) किसी एक वर्ण से मेल करने के लिए प्रतीक। उदाहरण के लिए, kan शुरू होने वाली किसी भी चीज़ से मेल खाने के लिए दो वर्ण होते हैं और स्ट्रिंग roo साथ समाप्त होते हैं, आप निम्न पैटर्न का उपयोग कर सकते हैं:

    grep "kan..roo" file.txt

    उपयोग (कोष्ठक) कोष्ठक में संलग्न किसी एक वर्ण से मेल खाने के लिए। उदाहरण के लिए, उन पंक्तियों को ढूंढें जिनमें accept या " accent " accent , आप निम्नलिखित पैटर्न का उपयोग कर सकते हैं:

    grep "accet" file.txt

    उपयोग (कोष्ठक) कोष्ठक में संलग्न किसी एक वर्ण से मेल खाने के लिए। निम्नलिखित पैटर्न co(any_letter_except_l)a किसी भी संयोजन से मेल co(any_letter_except_l)a जैसे, coca , cobalt और इतने पर, लेकिन cola युक्त लाइनों से मेल नहीं खाएगा।

    grep "coa" file.txt

अगले वर्ण के विशेष अर्थ से बचने के लिए, \ (बैकस्लैश) प्रतीक का उपयोग करें।

एक्सटेंडेड रेगुलर एक्सप्रेशन

पैटर्न को एक विस्तारित नियमित अभिव्यक्ति के रूप में व्याख्या करने के लिए, -E (या --extended-regexp ) विकल्प का उपयोग करें। विस्तारित नियमित अभिव्यक्तियों में अधिक जटिल और शक्तिशाली खोज पैटर्न बनाने के लिए अतिरिक्त मेटा-वर्णों के साथ सभी बुनियादी मेटा-वर्ण शामिल हैं। नीचे कुछ उदाहरण दिए गए हैं:

  • दिए गए फ़ाइल से सभी ईमेल पतों को मिलान और निकालें:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    किसी दिए गए फ़ाइल से सभी मान्य आईपी पते को मिलाएं और निकालें:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

-o विकल्प का उपयोग केवल मिलान स्ट्रिंग को प्रिंट करने के लिए किया जाता है।

मैच से पहले प्रिंट लाइनें

मिलान लाइनों से पहले एक विशिष्ट संख्या में लाइनों को मुद्रित करने के लिए, -B (या --before-context ) विकल्प का उपयोग करें।

उदाहरण के लिए, मिलान लाइनों से पहले प्रमुख संदर्भ की पांच पंक्तियों को प्रदर्शित करने के लिए, आप निम्न कमांड का उपयोग करेंगे:

grep -B 5 root /etc/passwd

एक मैच के बाद प्रिंट लाइन्स

मिलान लाइनों के बाद विशिष्ट संख्या में लाइनों को मुद्रित करने के लिए, (या --after-context ) विकल्प का उपयोग करें।

उदाहरण के लिए मिलान लाइनों के बाद अनुगामी संदर्भ की पांच पंक्तियों को प्रदर्शित करने के लिए, आप निम्नलिखित कमांड का उपयोग करेंगे:

grep -A 5 root /etc/passwd

निष्कर्ष

grep कमांड आपको फाइलों के अंदर एक पैटर्न की खोज करने की अनुमति देता है। यदि एक मैच पाया जाता है, तो grep निर्दिष्ट पैटर्न वाली लाइनों को प्रिंट करेगा।

ग्रीप उपयोगकर्ता के मैनुअल पेज पर ग्रीप के बारे में जानने के लिए बहुत कुछ है।

grep टर्मिनल