2013-09-30 10 views
8

मैं एकाधिक लॉग फ़ाइलों से एक पैटर्न को grep करना चाहूंगा जो लगातार कुछ प्रक्रियाओं द्वारा अद्यतन किया जा रहा है और निरंतर इस grep के आउटपुट को पूंछ। नीचे आदेश does not काम है और मैं मिल - पूंछ: चेतावनी: मानक इनपुट अनिश्चित काल के लिए निम्नलिखितपूंछ एकाधिक फाइलें और grep आउटपुट

tail -f | grep --line-buffered "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log 

किसी तरह यह पता मदद कर सकते हैं अप्रभावी है?

+0

की डुप्लीकेट http://superuser.com/प्रश्न/59471/सरल-उपयोग-के-पूंछ-grep-एकाधिक-स्थितियों –

उत्तर

10

आप multitail उपकरण पर एक नजर है चाहिए (sudo apt-get install multitail का उपयोग कर स्थापित करें)

संक्षेप में, multitail के साथ, आप एक ही स्थान पर सभी के उत्पादन को देखने के लिए --mergeall झंडा उपयोग करने की आवश्यकता

multitail --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

आप व्यक्तिगत रूप से आउटपुट देखने के लिए multitail, उपयोग करते हुए इस फ़ाइल नाम के साथ-साथ दे देंगे ग्रेप

multitail -E "Search this: " --mergeall /var/links/proc2/id/myprocess*/Daily/myprocess*.log 

का उपयोग किए बिना ही कर सकते हैं।

multitail -E "Search this: " /var/links/proc2/id/myprocess*/Daily/myprocess*.log 
+2

आप मल्टीटाइल का किस संस्करण का उपयोग कर रहे हैं? मैं डेबियन के साथ पैक किए गए संस्करण के साथ मल्टीटाइल के आउटपुट को grep करने में असमर्थ हूं: _multitail 5.2.13_ – Thor

+0

@Thor ने मेरा उत्तर सही किया। –

5

गलती यह है कि आप फ़ाइलों को grep कमांड को देते हैं, पूंछ नहीं।

tail -f फ़ाइलों को इनपुट के रूप में प्राप्त करने की आवश्यकता है। प्रयास करें:

tail -f /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

भी फ़ाइल नाम पाने के लिए (हालांकि यह ग्रेप उत्पादन यह है की तरह नहीं होगा):

tail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered -e'^==> .* <==$' -e'Search this: ' 
+1

धन्यवाद।यह आंशिक रूप से काम करता है लेकिन मुझे फ़ाइल नाम नहीं मिलते हैं जहां पैटर्न पाया जाता है? – 212

1

यह एक दिलचस्प सवाल है और इसका सरल उत्तर होना चाहिए: पूंछ साथ उपसर्ग स्विच का उपयोग करें, लेकिन दुर्भाग्य से यह वर्तमान में tail के सबसे संस्करणों में लागू नहीं है।

जैसा कि मैंने इसे देखा है, आपके पास दो विकल्प हैं: कार्य के लिए मानक उपकरण अनुकूलित करें (Udys answer देखें) या अपनी पसंदीदा स्क्रिप्टिंग/प्रोग्रामिंग भाषा के साथ अपना स्वयं का टूल लिखें।

नीचे एक तरीका है जिसे आप perl के लिए File::Tail::Multi मॉड्यूल के साथ कर सकते हैं। ध्यान दें कि आपको मॉड्यूल को सीपीएएन (cpan -i File::Tail::Multi) से स्थापित करने की आवश्यकता हो सकती है।

निम्न स्क्रिप्ट को सहेजें उदा। mtail अपने निष्पादन योग्य पथ पर और स्क्रिप्ट निष्पादन योग्य बनाएं।

#!/usr/bin/env perl 

use File::Tail::Multi; 

$| = 1; # Enable autoflush 

$tail = File::Tail::Multi->new(RemoveDuplicate => 0, 
           OutputPrefix => 'f', 
           Files   => \@ARGV); 

while(1) { $tail->read; $tail->print; sleep 2 } 

'p' को बदलें OutputPrefix अगर आप पूरा पथ उपसर्ग पसंद करते हैं।

इस तरह भागो यह:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep --line-buffered "Search this: " 

आप जब grep पिछले आदेश है --line-buffered निर्दिष्ट करने की आवश्यकता नहीं है, इसलिए इस के लिए पर्याप्त है:

mtail /var/links/proc2/id/myprocess*/Daily/myprocess*.log | grep "Search this: " 
+0

1) यह multitail का उपयोग करने से अलग कैसे है? 2) क्या यह फाइलनामों द्वारा आउटपुट करेगा, क्योंकि ओपी @Udys उत्तर> –

+0

@ ansh0l पर टिप्पणियों में पूछता है: 1) मल्टीटाइल अपने परिणामों को श्राप में आउटपुट करता है, जो greppable नहीं है। 2) हां, प्रत्येक पंक्ति में मूल फ़ाइल नाम prefixed है। – Thor

+0

आह ठीक है, शाप के लिए +1। लेकिन मल्टीटाइल के फ्लैग के साथ, आपको grep खुद को करने की आवश्यकता नहीं होगी। –

संबंधित मुद्दे