grep -

2016-12-30 12 views
7

पढ़ने वाली फ़ाइलों की सीमा संख्या मेरे पास 100,000 से अधिक फ़ाइलों वाली निर्देशिका है। मैं जानना चाहता हूं कि स्ट्रिंग "str1" इनमें से किसी भी फाइल की सामग्री के हिस्से के रूप में मौजूद है या नहीं।grep -

कमांड: grep -l 'str1' * बहुत सारी फाइलें पढ़ता है क्योंकि यह सभी फ़ाइलों को पढ़ता है।

अगर मैं एक मैच पाता हूं तो आगे की फ़ाइलों को पढ़ने से रोकने के लिए मैं grep से कैसे पूछ सकता हूं? कोई भी लाइनर?

नोट: मैंने grep -l 'str1' * | head को आजमाया है लेकिन कमांड को पिछले एक के जितना समय लगता है।

+0

क्या कमांड निर्देशिका में कमांड वाली निर्देशिका में काम करता है? –

+0

शायद, पहले ही यहां उत्तर दिया गया है: http://stackoverflow.com/questions/14093452/grep-only-the-first-match-and-stop –

+0

'head -1' चाल करेगा –

उत्तर

5

आपके कमांड तर्क में 100,000 फ़ाइल नामों का नामकरण समस्या का कारण बन रहा है। यह शायद शेल कमांड लाइन के आकार से अधिक है।

लेकिन आप अगर आप सिर्फ निर्देशिका फ़ाइलों में हैं (जो . है अगर आप मौजूदा निर्देशिका में फ़ाइलों को खोज करना चाहते हैं) के नाम के साथ पुनरावर्ती विकल्प का उपयोग सभी फ़ाइलों को नाम देने की जरूरत नहीं है:

grep -l -r 'str1' . | head -1 
+0

सिवाय इसके कि '-r' काफी मानक नहीं है ... –

+0

थोड़ा अतिरिक्त ओम्फ के लिए, मैं' LC_ALL = "C" grep-m1 -l -r 'str1' में टॉस करता हूं। | हेड -1' – bishop

+2

@gniourf_gniourf, ओपी का प्रश्न टैग किया गया है [टैग: लिनक्स] तो मुझे लगता है कि यह मानना ​​सुरक्षित है कि वे जीएनयू grep का उपयोग कर रहे हैं। –

3

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

grep -m 1 str1 * /dev/null | head -1 

यदि कोई फ़ाइल है, तो उपरोक्त/dev/null यह सुनिश्चित करता है कि grep आउटपुट में फ़ाइल नाम मुद्रित करता है।

आप किसी भी फाइल में पहला मैच पाने के बाद बंद करना चाहते हैं: आप फ़ाइलों की एक बड़ी संख्या के साथ एक निर्देशिका है जब

for file in *; do 
    if grep -q -m 1 str1 "$file"; then 
    echo "$file" 
    break 
    fi 
done 

for पाश भी too many arguments मुद्दे से बचाता है।

+0

बहुत अच्छा। मैं एक लाइनर खोजने की उम्मीद कर रहा था, लेकिन ये कथन करेंगे। – user2070775

+1

ध्यान दें कि ओपी पहले से ही '-l' का उपयोग कर रहा है जो पहले मैच के बाद' grep' स्टॉप बनाता है। –

+1

'* में फ़ाइल के लिए 'कभी भी" बहुत अधिक तर्क "से पीड़ित नहीं होगा, यह इसके लिए एक कामकाज है। उदाहरण के लिए, यहां देखें: http://www.in-ulm.de/~mascheck/various/argmax/ –