2012-12-30 31 views
155

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

# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory 

रिटर्न:

Pulsanti Operietur 
Pulsanti Operietur 

शायद ग्रेप यह करने के लिए सबसे अच्छा तरीका नहीं है? तुम मुझे बताओ, बहुत बहुत धन्यवाद।

उत्तर

262

-m 1 का मतलब किसी दिए गए फ़ाइल में पहला मैच वापस करना है। लेकिन यह अभी भी अन्य फाइलों में खोजना जारी रखेगा। इसके अलावा, यदि एक ही पंक्ति में दो या दो से अधिक मिलान किए गए हैं, तो वे सभी प्रदर्शित होंगे।

आप इस समस्या को हल करने के लिए head -1 उपयोग कर सकते हैं:

grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -1 
+0

कमाल! धन्यवाद। बीटीडब्ल्यू - क्या वे सभी अन्य तर्क आवश्यक हैं जो मेरे पास कमांड में हैं? और क्या होगा अगर मैं मौका से इसे पाइप नहीं कर सकता (बस मामले में)। –

+2

मुझे नहीं लगता कि वे जरूरी हैं (स्पष्ट रूप से '-r' को छोड़कर), लेकिन उन्हें चोट नहीं पहुँचना चाहिए (हालांकि मैं' -a' का उपयोग नहीं करता) – mvp

+1

बिल्कुल वही मुझे जो चाहिए था। मेरा पैटर्न एक ही पंक्ति पर दो बार पाया गया था और 'grep -m 1' इस वजह से दोनों उदाहरण लौटा। '| सिर -1' इसे हल किया! – harperville

12

ग्रेप एक तरह कार्यक्रम ack एक -1 विकल्प बंद हो जाता है कि कम से पहला मैच कहीं भी पाया है। यह -m 1 का समर्थन करता है जो @ एमवीपी भी संदर्भित करता है। मैंने इसे वहां रखा क्योंकि अगर मैं कुछ कोड ढूंढने के लिए स्रोत कोड का एक बड़ा पेड़ खोज रहा हूं जो मुझे पता है कि केवल एक फ़ाइल में मौजूद है, तो इसे खोजने के लिए अनावश्यक है और इसे Ctrl-C दबाएं।

+0

तो आप कहेंगे कि एएपी grep से तेज है?मैं वास्तव में गति कारक से भी चिंतित हूं। –

+0

एके जीईपी से तेज़ हो सकता है, जो आप खोज रहे हैं उसके आधार पर। कृपया ध्यान दें कि एक स्रोत कोड खोजने के बारे में है। यदि आप सामान्य फाइलों को खोजना चाहते हैं, तो कम से कम एएक्स 1.x में यह कम अच्छा है। एएके के बारे में पढ़ें और देखें कि क्या यह आपकी आवश्यकताओं के अनुरूप हो सकता है। –

+2

मैं लंबे समय से एक का उपयोग कर रहा हूं लेकिन हाल ही में [द रजत खोजकर्ता] (https://github.com/ggreer/the_silver_searcher) पर स्विच किया गया है जो मुझे तेजी से एके –

4

एक एकल लाइनर, find का उपयोग कर:

find -type f -exec grep -lm1 "PATTERN" {} \; -a -quit 
+4

यह * बहुत धीमा होने जा रहा है, क्योंकि प्रत्येक फ़ाइल के लिए grep की प्रतिलिपि मिल जाएगी। 'grep -r' बहुत तेज़ी से काम करता है - इसकी एकमात्र प्रतिलिपि जो निर्देशिका ट्रैवर्सल करती है। – mvp

+0

सच; यद्यपि खोज केवल फ़िल्टर किए गए परिणामों पर काम करने के लिए अनुकूलित किया जा सकता है, जो ऑपरेशन को कैच-ऑल जीईआर की तुलना में बहुत तेज बना सकता है। संदर्भ पर निर्भर करता है। –

13

आप कर सकते हैं पाइप stdbuf साथ संयोजन के रूप में head को grep परिणाम।

ध्यान दें, इसी क्रम वां मैच के बाद रोक सुनिश्चित करने के लिए, आप stdbuf का उपयोग कर यह सुनिश्चित करना की जरूरत grep इसके उत्पादन बफ़र नहीं है:

stdbuf -oL grep -rl 'pattern' * | head -n1 
stdbuf -oL grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/dir | head -n1 
stdbuf -oL grep -nH -m 1 -R "django.conf.urls.defaults" * | head -n1 

जैसे ही head 1 लाइन की खपत, इसे समाप्त कर और grepSIGPIPE प्राप्त करेगा क्योंकि यह अभी भी पाइप पर कुछ आउटपुट करता है जबकि head चला गया था।

यह माना जाता है कि किसी फ़ाइल नाम में नई लाइन नहीं है।

संबंधित मुद्दे