2012-11-29 16 views
11

में फ़ाइल में स्ट्रिंग खोजने का तेज़ तरीका मैं यूनिक्स में फ़ाइल में स्ट्रिंग पैटर्न ढूंढना चाहता हूं। मैं नीचे कमांड का उपयोग करता हूं:यूनिक्स

$grep 2005057488 filename 

लेकिन फ़ाइल में लाखों लाइनें हैं और मेरे पास ऐसी कई फ़ाइलें हैं। Grep के अलावा पैटर्न पाने का सबसे तेज़ तरीका क्या है।

उत्तर

0
sed -n '/2005057488/p' filename 

यह सुनिश्चित नहीं है कि यह grep से तेज है या नहीं।

+0

यह संभावना नहीं है में उस विशेष स्ट्रिंग प्राप्त करने के लिए काम करता है। 'grep' को केवल एक चीज करने के लिए डिज़ाइन किया गया है (मेरा उत्तर देखें) – Steve

+0

@steve, क्या मुझे अपना जवाब तब हटा देना चाहिए? एसओ के लिए नया कृपया मदद करे। जीएनयू समांतर – Anon

16

grep आमतौर पर जितना तेज़ हो जाता है उतना तेज़ होता है। यह केवल एक चीज और एक चीज के लिए डिज़ाइन किया गया है - और यह वही करता है जो यह बहुत अच्छा करता है। आप पढ़ सकते हैं क्यों here

हालांकि, चीजों को गति देने के लिए आप कुछ कोशिश कर सकते हैं। सबसे पहले, ऐसा लगता है कि आप जिस पैटर्न को खोज रहे हैं वह एक निश्चित स्ट्रिंग है। सौभाग्य से, grep एक 'निश्चित तार' का विकल्प है:,

-F, --fixed-strings 
     Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.) 

दूसरे क्योंकि grep आम तौर पर बहुत UTF-8 पर धीमी है, आप पर्यावरण LANG=C की स्थापना द्वारा राष्ट्रीय भाषा समर्थन (NLS) अक्षम करने का प्रयास कर सकता है।

LANG=C grep -F "2005057488" file 

तीसरा, यह अपने प्रश्न में स्पष्ट नहीं था, लेकिन अगर अपने ही अगर कुछ आपकी फ़ाइल में एक बार मौजूद है खोजने की कोशिश कर, आप भी की अधिकतम संख्या को जोड़ने की कोशिश कर सकते: इसलिए, आप इस मिश्रण की कोशिश कर सकते पैटर्न खोजने के लिए समय। इसलिए, जब पहली घटना मिलने के बाद -m 1, grep तत्काल छोड़ दिया जाएगा। आपका आदेश अब ऐसा दिखाई दे सकता:

LANG=C grep -m 1 -F "2005057488" file 

अंत में, यदि आप एक मल्टीकोर सीपीयू है, तो आप GNU parallel एक जाना दे सकता है। यह explanation of how to use it with grep के साथ आता है। समानांतर उपयोग --pipe में एक बड़ी फ़ाइल

find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {} 

grep करने के लिए:: grep के प्रति कोर 1.5 नौकरियों को चलाने के लिए और दे 1000 तर्क

< bigfile parallel --pipe grep STRING 

अपने डिस्क और सीपीयू पर निर्भर करता है यह बड़ा पढ़ने के लिए तेजी से हो सकता है ब्लॉक:

< bigfile parallel --pipe --block 10M grep STRING 
+0

+1। – Anon

+0

+1 महान उत्तर के लिए –

+1

बहुत स्पष्ट और सटीक उत्तर! धन्यवाद आप =) – digvijay91

2

grep sed से तेज़ काम करता है।

$grep 2005057488 filename 
$sed -n '/2005057488/p' filename 

फिर भी दोनों एक फ़ाइल