किसी विशिष्ट समयावधि में लॉग फ़ाइल को कैसे प्राप्त करें


22

मेरे पास एक लॉग फ़ाइल है, लॉग में प्रत्येक पंक्ति एक तारीख के साथ तैयार है, जैसे:

2012-03-06 11:34:48,657 blah blah blah...

मैं grepइस फाइल को कैसे करूं और केवल सुबह 8 बजे से रात 11 बजे तक ही लाइनें प्राप्त करूं?

मेरा इरादा है कि मैं सुबह 8 बजे से 11 बजे के बीच होने वाली त्रुटियों की संख्या को गिनना चाहता हूं।

जवाबों:


24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

विस्तृत विवरण विभिन्न रेगेक्स (नियमित अभिव्यक्ति) ट्यूटोरियल में पाया जा सकता है ; egrep"POSIX विस्तारित" वाक्यविन्यास ( man 7 regex) का उपयोग करता है ।

  • पहले का ^अर्थ है "लाइन की शुरुआत"।

  • [^ ]+ वास्तविक दिनांक की परवाह किए बिना, केवल दिनांक फ़ील्ड से मेल खाता है।

    • [...]"कोष्ठक के बीच कोई भी वर्ण", इसलिए या [89]तो मेल खाएगा 8या 9; [0-9]किसी भी संख्या है, और एक अंतरिक्ष को छोड़कर[^ ] कुछ भी है ( अंदर के कोष्ठक के कारण)।^

    • +इसका मतलब है "एक या एक से अधिक पिछले की" (उदाहरण के लिए, a+से मेल खाएंगे a, aaaऔर aaaaaaaa)।

    • तो ^[^ ]+लाइन की शुरुआत के साथ शुरू होगा, और कई गैर-अंतरिक्ष वर्णों के साथ मैच कर सकता है।

  • (...|...|...)इसका मतलब है "या तो दिए गए पैटर्न के", तो (0[89]|1[0-9]|2[012])इसका मतलब है "या तो 0[89]या 1[0-9]या 2[012]"। यह 08 से 22 तक सभी नंबरों से मेल खाएगा।


कुछ बेहतर विकल्प है:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

-Fविकल्प के अनुसार अलग क्षेत्रों में हर पंक्ति विभाजन [: ]regex (मिलान या तो :या स्पेस), और awk स्क्रिप्ट चेकों 2 कॉलम (घंटे)।


नमस्ते, यह काम करता है .. लेकिन क्या आप थोड़ा स्पष्टीकरण जोड़ सकते हैं कि यह कैसे काम करता है? मैं ^[^ ]+भाग नहीं मिलता ..
रोजी

20

क्यों grep का उपयोग कर परेशान? आप बस sed का उपयोग कर सकते हैं।

उदाहरण:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

यह June 17 13:39:54और के बीच के सभी लॉग को प्रिंट करेगाJune 18 10:50:28


1
मुझे लगता है कि ओपी चाहता है कि सुबह 8 बजे से 11 बजे के बीच सभी लॉग्स हों, एक विशेष दिन से बस बॉट।
डेनिस

1
वह ऐसा कर भी सकता है। जैसे: sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16: 34: 48 / p' logfile.name
Nima G

1
गंदा टाइपो। मैं मतलब: नहीं एक विशिष्ट दिन से लोगों को।
डेनिस

2
इस दृष्टिकोण के साथ समस्या यह है कि उस टाइमस्टैम्प के साथ लॉग फ़ाइल में एक पंक्ति होनी चाहिए। उपरोक्त उदाहरण में, अगर टाइमस्टैम्प 2012-03-06 11:34:48 के साथ कोई रेखा नहीं है, तो कुछ भी नहीं छपेगा। उपरोक्त अटैक दृष्टिकोण ऐसे मामलों के लिए काम करेगा (यानी आप 8 और 11 के बीच घंटे के साथ सभी लॉग चाहते हैं, लेकिन आप नहीं जानते कि 2012-03-06 08:00:00 बजे या उसके लिए कोई लॉग प्रविष्टि है या नहीं घंटा भर)।
user650654

0

वास्तव में ऐसा करने का एक बहुत आसान तरीका है।

डाउनलोड / प्रलेखन: autodrgrep.kl.sh

कमान:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

स्पष्टीकरण:

  • autodrgrep.kl.sh उपकरण का नाम है।

  • notchef एक विकल्प है जो उपकरण को यह बताने के लिए दिया जाता है कि उसे क्या करना है। इस विशेष मामले में, यह टूल को बता रहा है कि लॉग फ़ाइल /tmp/client.log किस प्रकार की है।

  • /tmp/client.log निश्चित रूप से लॉग फ़ाइल है।

  • 2016-05-08_19: 12: 00,2016-05-08_21: 13: 00 उस लॉग के भीतर से तारीख की सीमा है जिसे आप स्कैन करना चाहते हैं

  • "INFO" उन स्ट्रिंग्स में से एक है जो लॉग्स की पंक्तियों में हैं जिन्हें आप रुचि रखते हैं।

  • "a2ensite" उसी लाइन पर एक और स्ट्रिंग है जिस पर आप "INFO" स्ट्रिंग खोजने की अपेक्षा करते हैं। इन दो तारों को निर्दिष्ट करना (INFO और a2ensite) अलग-अलग लाइनों को अलग करता है और संसाधित करता है जो आप बहुत तेज चाहते हैं, खासकर यदि आप एक विशाल लॉग फ़ाइल के साथ काम कर रहे हैं।

  • 5 चेतावनी निर्दिष्ट करता है। 5 निर्दिष्ट करके, आप प्रोग्राम को चेतावनी के रूप में चेतावनी देने के लिए कह रहे हैं यदि आपके द्वारा निर्दिष्ट खोज स्ट्रिंग्स के कम से कम 5 घटनाएँ हैं

  • 10 क्रिटिकल निर्दिष्ट करता है। 10 निर्दिष्ट करके, यदि आप निर्दिष्ट खोज स्ट्रिंग्स के कम से कम 10 घटनाएँ हैं, तो आप कार्यक्रम को महत्वपूर्ण के रूप में सतर्क करने के लिए कह रहे हैं।

  • -शो निर्दिष्ट करता है कि आपको किस प्रकार की प्रतिक्रिया मिलेगी। निर्दिष्ट करके -shown, आप कह रहे हैं कि यदि ऐसा कुछ पाया जाता है जो स्क्रीन के लिए निर्दिष्ट पैटर्न, आउटपुट से मेल खाता है।

नमूना रन:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

क्या होगा यदि उपयोगकर्ता निर्दिष्ट तिथि सीमा या समय सीमा लॉग में नहीं है?

उपरोक्त कमांड के प्रत्येक रन में हमेशा एक पंक्ति (आउटपुट की अंतिम पंक्ति) होगी जो या तो "ATWFILF" या "ETWNFILF" कहती है।

  • ATWFILF का अर्थ है कि आपके द्वारा खोजा गया वास्तविक दिनांक सीमा या समय सीमा लॉग में पाई गई थी। तो यह बहुत अच्छा है।

  • ETWNFILF का अर्थ है वास्तविक तिथि सीमा या आपके द्वारा खोजा गया समय सीमा लॉग में नहीं मिला था। इस मामले में, आपके द्वारा निर्दिष्ट समय का निकटतम समय पता लगाया जाएगा और इसके बजाय उपयोग किया जाएगा।

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