कैसे एक ही स्ट्रिंग लेकिन एक ही समय में कई फ़ाइलों के लिए grep करने के लिए?


57

मेरे पास लॉग फ़ाइलों का एक सेट है जिसकी मुझे समीक्षा करने की आवश्यकता है और मैं एक ही समय में एक ही फाइल पर विशिष्ट तारों की खोज करना चाहूंगा क्या यह संभव है? वर्तमान में मैं उपयोग कर रहा हूं

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

मैं इसका उपयोग कैसे करूं और एक साथ कई फ़ाइलों के तारों की खोज करूं? यदि यह कुछ ऐसा है जिसे स्क्रिप्ट करने की आवश्यकता है, तो क्या कोई ऐसा करने के लिए एक सरल स्क्रिप्ट प्रदान कर सकता है?


2
grepएक से अधिक फ़ाइल तर्क ले सकते हैं।
jw013

जवाबों:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

मुझे grepनिर्देशिकाओं को कैसे छोड़ना है, लेकिन फिर भी सभी फ़ाइलों की पुनरावृत्ति की जांच करें? grep -E 'text' **/*काम करता है, लेकिन प्रत्येक उपनिर्देशिका के लिए एक त्रुटि संदेश देता है (और फिर उनमें सभी फाइलों को सही ढंग से जांचता है)
जोर्न

4
@ जोर्न, वास्तव में आपको एक नया प्रश्न पूछना चाहिए, लेकिन उपयोग करेंfind . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
वाइल्डकार्ड

20

आप कुछ इस तरह का उपयोग कर सकते हैं:

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

यह हर फाइल .logको एक्सटेंशन के रूप में पाएगा और grepकमांड को लागू करेगा ।


यही कारण है कि मेरी फ़ाइलों के सभी ताकि .log कर रहे हैं "बहुत आसान था :) असल में ग्रेप -E 'घातक | त्रुटि | महत्वपूर्ण | विफलता | चेतावनी' * .log भी काम करता है धन्यवाद।!
user53029

1
समझ / अनुकूलन user53029 का कितना बड़ा प्रयास!
गिल्स क्वानोट

1
जब आप सिर्फ उपयोग कर सकते हैं तो फिल्म के नाम पर व्हाट्सएप पर गंभीर टूटनेxargs की संभावना क्यों है ? find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +
वाइल्डकार्ड

16

यदि यह सरल है, तो आप प्रत्येक फ़ाइल को एक के बाद एक निर्दिष्ट कर सकते हैं।

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
इतना सरल, लेकिन बहुत लंबे समय से इसके लिए देख रहा था: 0
एडम ह्यूजेस

3

यदि आपको फ़ाइल नामों के एक मनमाने सेट पर grep करने की आवश्यकता है जिसे एक नियमित अभिव्यक्ति द्वारा प्राप्त नहीं किया जा सकता है:

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

एक के बाद एक फिल्मनामों को चिपकाने से क्या फायदा? आप एक फ़ाइल फ़ाइल पर फ़ाइल नाम सूची संकलित कर सकते हैं और फिर इसे पेस्ट कर सकते हैं।


1

यदि आप उपनिर्देशिका फ़ाइलों में भी पुनरावर्ती खोज करना चाहते हैं तो आप नीचे दिए गए आदेश का उपयोग कर सकते हैं

यह उपनिर्देशिका फ़ाइलों में भी पुनरावर्ती खोज करेगा

egrep -r "string1|string2" pathname


0

यह बहुत समय लेने वाला कार्य था। और हां, यदि आप एक ही समय में कई अलग-अलग लॉग में कई स्ट्रिंग्स की खोज करने जा रहे हैं, तो निश्चित रूप से इसे स्क्रिप्ट करने की आवश्यकता है। लेकिन मुझे हाल ही में ऐसा करना पड़ा और यह काफी दर्दनाक था। फिर भी, यह किया जाता है और तैयार होता है और निम्न लिंक से डाउनलोड किया जा सकता है:

लॉग स्क्रिप्ट स्क्रिप्ट डाउनलोड करें

जिस तरह से यह काम बहुत सरल है।

परिदृश्य 1: मॉनिटर केवल एक लॉग फ़ाइल में एक स्ट्रिंग

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

परिदृश्य 2: मॉनिटर वन स्ट्रिंग बस एक लॉग फ़ाइल में

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

परिदृश्य 3: एकाधिक लॉग फ़ाइलों में मॉनिटर सिंगल / मल्टीपल स्ट्रिंग्स

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

टिप्पणियाँ:

_P_ का अर्थ है या - यह पाइप को बदल देता है "|" प्रतीक क्योंकि यह कम संभावना है कि आपको "_P_" युक्त स्ट्रिंग की खोज करनी होगी। यदि आप "_P_" लिखना नहीं चाहते हैं, तो आप बस _P_ को "|" |

इस स्क्रिप्ट का उपयोग करते समय, आप जिन मापदंडों को बार-बार बदल रहे हैं, वे हैं:

  1. लॉग फ़ाइल या लॉग डायरेक्टरी पर नजर रखी जाए
  2. एक लॉग फ़ाइल की आयु इसके लिए निगरानी रखने के लिए होनी चाहिए..मैं 60 मिनट से अधिक की टाइमस्टैम्प वाली किसी भी लॉग फ़ाइल की निगरानी या खोज नहीं करता।
  3. उन स्ट्रिंग्स (ओं) / पैटर्न (ओं) को आप देखना चाहते हैं
  4. टैग - यह दूसरा अंतिम तर्क है जिसे आपको आपूर्ति करना है। यह उस लॉग फ़ाइल के बारे में आँकड़े रिकॉर्ड करता है, जिसकी आप निगरानी कर रहे हैं / var / tmp / logXray
  5. लॉग ऑप्शन -ndshow - यह वह पैरामीटर है जिसे आप उपयोग करना चाहते हैं यदि आप निर्दिष्ट पैटर्न से मिलान किए गए लॉग से प्रविष्टियों को आउटपुट करना चाहते हैं। यदि आप केवल प्रत्येक पैटर्न की कुल गणना देखना चाहते हैं, तो बस '-ndshow' को '-ndfoundmul' से बदलें।

'-Ndfoundmul' का उपयोग करते समय, आपको निम्न के समान आउटपुट मिलेगा:

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

मूल पोस्टर के मुद्दे का समाधान: एकाधिक लॉग फ़ाइलों में एकाधिक स्ट्रिंग्स के लिए स्कैन करें

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

OSes: यह उबंटू और रेड हैट पर परीक्षण किया गया था


0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

यह 'log_file' नाम से शुरू होने वाली फाइलों में 'घातक या त्रुटि या महत्वपूर्ण या विफलता या चेतावनी या खोज-स्ट्रिंग' की खोज करेगा? और पथ / पथ / में / / / फ़ाइल के लिए 'लो ' * का विस्तार करें और खोज स्ट्रिंग को एक यादृच्छिक रंग और प्रिंट लाइन नंबर दें जो इसे मिला था।


निश्चित रूप से यह एक काम करने वाला उत्तर है, लेकिन उपयोगकर्ता ने एक पैटर्न का उपयोग करके खोज करने के लिए कहा, आपने एक निश्चित खोज स्ट्रिंग का उपयोग करके उत्तर दिया। क्षमा करें, लेकिन उन चीज़ों को जोड़ना जिनके लिए नहीं पूछा गया था, जैसे कि लाइन-नंबरिंग और परिणामों का रंग उत्तर को अधिक लाभदायक बनाने की संभावना नहीं है। लेकिन ऐसे अन्य प्रश्न होंगे जो संभवतः आपके grepकौशल का जवाब दे सकते हैं ताकि आपके यूएसई कैरियर पर शुभकामनाएं मिलें!
zagrimsan

@zagrimsan बिंदु लिया गया है, मैंने 'ई-घातक' कहा है । त्रुटि | महत्वपूर्ण | विफलता | चेतावनी | ' इसके लिए परम।
ओबैद

और हे, उन्होंने विशेष रूप से कई फ़ाइलों के लिए कहा, न कि एक खोज पैटर्न। कृपया प्रश्न फिर से पढ़ें।
ओबैद

प्रश्न का उद्धरण: "विशिष्ट स्ट्रिंग्स खोजें", और प्रश्न खोज पैटर्न को दिखाता है (जिसका उपयोग करने के लिए कई स्ट्रिंग्स से मिलान करने के लिए)। आप सही कह रहे हैं कि सवाल का शीर्षक उस चीज़ से थोड़ा हटकर है जो वह वास्तव में पूछ रहा है, हालाँकि। BTW, -Eऔर -Fएक ही समय में इस्तेमाल नहीं किया जा सकता है, वे परस्पर विरोधी हैं (टाइपो?)।
zagrimsan

0

JigarGandhi का जवाब तारांकन चिह्न वाइल्डकार्ड के उपयोग को दर्शाता है। उनमें से अधिक हैं और आप उन्हें यहां या चलाकर देख सकते हैं man 7 glob

उनमें से एक है कि मैं उपयोगी पाया रेंज के साथ मेल खाता है []। चूंकि मैं जिस सिस्टम पर काम करता हूं वह क्रमिक रूप से गिने लॉग फ़ाइलों का उत्पादन करता है product.log.1 product.log.2 ... product.log.200, जैसे कि यह 3 या 4 अनुक्रमिक फाइलों पर एक ही कमांड के साथ grep करना आसान है, लेकिन अधिक नहीं। तो यह

grep 'whatever' product.log.[5-7]

product.log के साथ समाप्त होने वाली सभी फ़ाइलों के लिए grep होगा। 5, 6 या 7. वाइल्डकार्ड के अंत में होना आवश्यक नहीं है, इसलिए झिलमिलाहट के जवाब को सरल बनाया जा सकता है

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

यह भी ध्यान दें कि इन वाइल्डकार्ड का उपयोग अन्य कमांडों में भी किया जा सकता है cp, उदाहरण के लिए।


0

यदि आप फ़ाइलें सभी समान फ़ोल्डर हैं, तो आप घुंघराले ब्रेसिज़ का उपयोग भी कर सकते हैं।

एक उदाहरण देखें

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

यदि आप grep में s जोड़ते हैं तो यह गुम फाइलों के बारे में त्रुटियों को दबा देता है

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

मैं बस अपने आप के साथ प्रयोग कर रहा था कमांड के लिए जो कई डिस्ट्रोस में काम करता है जहां यह ओएस अंतर के कारण एक फ़ाइल बनाम दूसरी में है।

मेल लॉग

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

आर्काइव्ड मेल लॉग 2> / dev / null का उपयोग करते हुए सुपरग्रेग लापता .gz चेतावनियाँ

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

संदर्भ: क्या किसी रास्ते में एक से अधिक फ़ाइलों को संदर्भित करने का एक तरीका है पूरे मार्ग को फिर से बनाए बिना?

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