यह कैसे करता है [t] grep में ricky ब्रैकेट एक्सप्रेशन?


38

मैंने हाल ही में यह एक-लाइनर देखा:

$ ps -ef | grep [f]irefox 

thorsen   16730     1  1 Jun19 ?        00:27:27 /usr/lib/firefox/firefox ...

तो यह डेटा में "फ़ायरफ़ॉक्स" के साथ प्रक्रियाओं की सूची को वापस करने के लिए लगता है, लेकिन खुद grep प्रक्रिया को छोड़ देता है, और इसलिए लगभग इसके बराबर लगता है:

ps -ef |grep -v grep| grep firefox

मैं नहीं समझ सकता कि यह कैसे काम करता है। मैंने grep और अन्य जगहों पर मैन पेज देखा है, लेकिन स्पष्टीकरण नहीं पाया है।

और अगर मैं चला तो इस रहस्य को सुलझाना:

$ ps -ef | grep firefox  > data
$ grep [f]irefox data

thorsen   15820 28618  0 07:28 pts/1    00:00:00 grep --color=auto firefox
thorsen   16730     1  1 Jun19 ?        00:27:45 /usr/lib/firefox/firefox ....

[t] रिक काम करना बंद कर देता है!

यहाँ किसी को पता चल जाएगा कि मुझे क्या हो रहा है।

धन्यवाद।


हम्म, क्या आपको यकीन है कि यह सही है? ps -eaf | grep [fF] irefox अधिक समझ में आता है। यह एक नियमित अभिव्यक्ति की तरह दिखता है और इसका अर्थ है संलग्न अक्षरों में से किसी एक से मेल खाना। रेंज के रूप में भी किया जा सकता है, उदाहरण [0-9]
mbs

सही है। यही वह समस्या थी जो मुझे हो रही थी: एक चरित्र वर्ग जिसमें केवल एक ही चरित्र था, वह निरर्थक लग रहा था फिर भी "रहस्यमय" साइड इफेक्ट पैदा कर रहा था! वैसे भी जोकरडिनो ने अच्छी व्याख्या की है।
थॉर्सन

जवाबों:


57

चौकोर ब्रैकेट अभिव्यक्ति बश शेल (और अन्य शेल के साथ-साथ) जीआरईपी के चरित्र वर्ग पैटर्न मिलान का हिस्सा है।

grepकार्यक्रम डिफ़ॉल्ट रूप से POSIX बुनियादी नियमित अभिव्यक्ति को समझता है। इससे आप चरित्र वर्गों को परिभाषित कर सकते हैं। उदाहरण के लिए ps -ef | grep [ab9]irefox" irefox", " b irefox", " 9 irefox" मिलेंगे यदि वे मौजूद हैं, लेकिन " ab irefox" नहीं।

grep [a-zA-Z0-9]irefoxयहां तक ​​कि कमांड को सभी प्रक्रियाएं मिलेंगी जो बिल्कुल एक अक्षर या संख्या से शुरू होती हैं और "irefox" में समाप्त होती हैं।

तो इसके ps -ef | grep firefoxसाथ लाइनों के लिए खोज firefoxकरता है। चूंकि grep प्रक्रिया में "फ़ायरफ़ॉक्स" होता है, इसलिए grep को भी ऐसा लगता है। A जोड़ने से [], हम केवल वर्ण वर्ग "[f]" (जिसमें केवल "f" अक्षर होते हैं और बिना कोष्ठक के केवल "f" के समतुल्य हैं) खोज रहे हैं। कोष्ठक का लाभ अब यह है कि स्ट्रिंग "फ़ायरफ़ॉक्स" अब grep कमांड में प्रकट नहीं होता है। इसलिए, grep खुद को grep परिणाम में नहीं दिखाएगा।

क्योंकि बहुत से लोग वर्ग कोष्ठक से परिचित नहीं होते हैं क्योंकि चरित्र वर्ग मिलान और सामान्य रूप से नियमित रूप से अभिव्यक्त होता है, दूसरा परिणाम थोड़ा रहस्यमय लग सकता है।

यदि आप दूसरा परिणाम ठीक करना चाहते हैं, तो आप उन्हें इस तरह से उपयोग कर सकते हैं:

ps -ef | grep [f]irefox  > data
grep firefox data

(संदर्भ)


1
हम्म। यह मेरे साथ नहीं हुआ था कि [] शेल द्वारा समझाए गए कुछ को पहले से ही एक मौका मिलेगा। स्पष्टीकरण के लिए धन्यवाद। सभी [एम] yteries हल।
थॉर्सन

मदद करने के लिए खुश। एक अच्छा दिन :) है
jokerdino

1
बैश में, वर्ग कोष्ठक को grep में पारित किया जाएगा यदि उनके पास उस शब्द के लिए कोई मेल नहीं है (जो कि वर्तमान निर्देशिका में "फ़ायरफ़ॉक्स" नामक कोई फ़ाइल नहीं है)। हालाँकि, grep में वर्ण वर्ग भी हैं और grep में [f] सिर्फ f के समान है।
डैनियल हर्शकोविच

6
वास्तव में इस मामले में मुझे नहीं लगता कि यह grep से पहले शेल द्वारा व्याख्या किया गया है। मुझे लगता [f]है कि चरित्र वर्गों के लिए नियमित अभिव्यक्ति पैटर्न मिलान ब्रैकेट है। जैसा कि "[a-z0-9] irefox" grep "airefox" और "0irefox" से भी मेल खाता होगा। आप आसानी से देख सकते हैं कि यह बैश बिल्ट-इन नहीं है क्योंकि इसमें echo $([f])कोई त्रुटि है।
con-f-use

4
[f]irefoxइस उद्देश्य के लिए विशिष्ट कारण यह है कि यह शेल द्वारा विस्तारित नहीं है । जब शेल का विस्तार होता [f]irefoxहै firefox, तो यह grepदेखने का कारण बनता है firefox, और उसके बाद कमांड स्ट्रिंग firefoxका हिस्सा होता है grep, जैसे कि grep firefoxचलाया गया था। लेकिन शेल पैटर्न को ध्यान में रखते हुए अच्छा है , खासकर स्क्रिप्टिंग के दौरान, क्योंकि अगर कोई फाइल firefoxवर्तमान निर्देशिका में कॉल की जाती है , तो शेल का विस्तार [f]irefoxहोता हैfirefox और यह विधि विफल हो जाती है, अर्थात grepलाइन से psदिखाया गया है।
एलिया कगन

10

कारण यह है कि स्ट्रिंग

grep firefox

पैटर्न से मेल खाता है firefox, लेकिन स्ट्रिंग

grep [f]irefox

पैटर्न से मेल नहीं खाता [f]irefox(जो पैटर्न के बराबर है firefox)।

इसीलिए पहला grep अपनी प्रक्रिया कमांड लाइन से मेल खाता है, जबकि दूसरा नहीं।


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