2014-10-10 5 views
5

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

मुझे पता है कि फ़ाइल पर सरल grep कैसे करें। मान लीजिए कि अगर मेरा फ़ाइल नाम abc.log है और मुझे एक पंक्ति ढूंढनी है जिसमें "हैलो" शब्द है तो मैं हमेशा ऐसा करता हूं और यह मेरे लिए लाइन प्रिंट करता है।

grep -i "hello" abc.log 

लेकिन मुझे नहीं पता कि शब्दों के संयोजन के लिए grep कैसे करें। मतलब मेरे पास शब्दों की सूची होगी और मैं उन सभी शब्दों के लिए अपनी abc.log फ़ाइल स्कैन करूंगा और मैं उन पंक्तियों को मुद्रित करूंगा जिनमें वे शब्द अलग-अलग हैं।

#!/bin/bash 

data="hello,world,tester" 

# find all the lines which contains word hello or world or tester 

तो मेरे ऊपर खोल स्क्रिप्ट में मैं अपने डेटा चर विभाजित है और इसलिए किसी भी लाइन जो हैलो शब्द है abc.log में हैलो शब्द के लिए दिखाई देगा, मैं इसे बाहर दुनिया और परीक्षक के साथ के रूप में अच्छी तरह से मुद्रित और इसी तरह होगा।

मैं यह सुंदर जेनेरिक बनाने की कोशिश कर रहा हूं ताकि मुझे डेटा चर में शब्दों की सूची जोड़ने की ज़रूरत है, बिना लॉग grepping के वास्तविक तर्क को छूए।

उत्तर

6

आप एक फ़ाइल में अपने पैटर्न संग्रहीत करते हैं, एक प्रति पंक्ति, तो आप उपयोग कर सकते हैं grep -f file-with-patterns file-to-search.log

आदमी पृष्ठ से:

-f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. The empty file 
      contains zero patterns, and therefore matches nothing. (-f is 
      specified by POSIX.) 
+0

धन्यवाद o11c। मेरे मामले में पैटर्न बहुत बढ़ सकते हैं इसलिए फ़ाइल दृष्टिकोण अच्छा है लेकिन मैं इसमें एक और चीज़ जोड़ना चाहता था - यदि इसमें कोई विशेष शब्द है तो लाइन को प्रिंट न करें। मैं इसे अपने वर्तमान दृष्टिकोण से कैसे करूं? – john

+0

@ user2809564 'grep -v wordtoexclude' (या '-e' या' -f', आदि) के माध्यम से पहले' grep' को पाइप करें – o11c

+0

धन्यवाद। यह संभव हो सकता है कि मेरे पास कई पैटर्न भी शामिल हो सकते हैं ताकि बाहर निकलने के लिए कोई भी तरीका हो, जिसमें पैटर्न शामिल करने के लिए पैटर्न शामिल हैं और पैटर्न को बाहर करने के लिए पैटर्न है और फिर grep करने के लिए इस फ़ाइल का उपयोग करें? – john

6

मैं इस तरह, रेगुलर एक्सप्रेशन का उपयोग होगा:

grep -E 'hello|world|tester' abc.log 
+0

बहुत बहुत ब्रूचोस्की धन्यवाद। यह बढ़िया काम करता है। मेरे मामले में मेरे पास तीन से अधिक पैटर्न हो सकते हैं, इसलिए मैं इसे किसी वैरिएबल में स्टोर करने के बारे में सोच रहा था जैसे कि मैंने अपने प्रश्न में दिखाया है और फिर उस चर को विभाजित करें और इसे grepping शुरू करें या इसे फ़ाइल में भी स्टोर करें। क्या आपको लगता है कि इस जेनेरिक को शेल स्क्रिप्ट में बनाने का कोई बेहतर तरीका है? – john

+0

@ user2809564 क्योंकि कमांड लाइन तर्कों की लंबाई की सीमा है, यह दृष्टिकोण * आखिरकार * विफल हो जाएगा जहां फ़ाइल नहीं होगी। मुझे यकीन नहीं है कि आपका डेटा सेट * वह * बड़ा है या नहीं। – o11c

+0

@ user2809564 या तो एक अच्छा दृष्टिकोण है। यदि आप खोज करने के लिए बहुत से तारों की योजना बनाने की योजना नहीं बनाते हैं तो मैं इस इनलाइन दृष्टिकोण के साथ जा सकता हूं और केवल '|' पर शर्तों की सरणी में शामिल हो सकता हूं, अन्यथा @ o11c का उत्तर आपके लिए अच्छा काम करेगा – bruchowski

0

अलावा bruchowski's answer से, आप भी उपयोग कर सकते हैं:

grep -i -e "hello" -e "world" -e "tester" abc.log 

या

grep 'hello\|world\|tester' abc.log 

या

egrep 'hello|world|tester' abc.log 
संबंधित मुद्दे