मेरे पास एक लॉग फ़ाइल है जहाँ त्रुटियों का उल्लेख पंक्ति की शुरुआत में "ERROR" के रूप में किया जाएगा और अगली पंक्ति में त्रुटि के बारे में विस्तृत पाठ होगा। मैं फ़ाइल में "त्रुटि" की अंतिम घटना की खोज करना चाहता हूं ताकि मैं अंतिम त्रुटि ढूंढ सकूं और अगली पंक्ति प्रिंट कर सकूं या प्रतिलिपि एक चर के लिए रेखा है।
खोल में, मैं नीचे दिए गए आदेश को आजमा सकता हूं जो मुझे इसे प्राप्त करने में मदद करेगा। क्या कोई मुझे समकक्ष पर्ल कोड दे सकता है?
Grep -A1 त्रुटि sapinst.log | पूंछ -2
चूंकि लॉग फ़ाइल बड़ी होगी (~ 5000+ लाइनें), इसलिए मैं इसे किसी सरणी में संग्रहीत नहीं करना चाहता हूं।
2 जवाब
कुंजी उन पंक्तियों को रखना है जिन्हें आप एक बफर (सरणी) में प्रिंट करना चाहते हैं, यदि आप बाद में मैच पाते हैं तो उन्हें बदल दें।
my @buf;
my $keep = 0;
while (<>) {
if (/ERROR/) {
@buf = $_; # Discard any earlier match in favour of this one.
$keep = 1; # Also keep one more line.
}
elsif ($keep) {
--$keep;
push @buf, $_;
}
}
print(@buf);
उपरोक्त आमतौर पर आपके द्वारा पोस्ट की गई कमांड के समान व्यवहार करता है। हालांकि, इस घटना में कि ERROR
वाले के बाद दो पंक्तियाँ हैं, उपरोक्त आपके द्वारा पोस्ट किए गए आदेश से भिन्न व्यवहार करता है।
log1
:
ERROR foo1
foo2
meow
ERROR bar1
bar2
woof
log2
:
ERROR foo1
foo2
meow
ERROR bar1
आपका आदेश:
$ grep -A1 ERROR log1 | tail -2
ERROR bar1
bar2
$ grep -A1 ERROR log2 | tail -2
--
ERROR bar1
मेरा कार्यक्रम:
$ ./last_error log1
ERROR bar1
bar2
$ ./last_error log2
ERROR bar1
यह शायद एक सुधार है।
लाइनों के 2 लंबे बफर आज़माएं:
my $match = "no error found";
my @a = ("", "");
while (<STDIN>) {
@a = ($a[1], $_);
$match = $a[1] if $a[0] =~ /^ERROR/i;
}
print $match;
यह अंतिम त्रुटि प्रिंट करता है (या "कोई त्रुटि नहीं मिली")। सभी त्रुटियों को प्राप्त करने के लिए, असाइनमेंट को लूप में मिलान करने के लिए प्रिंट स्टेटमेंट में बदलें।
संबंधित सवाल
नए सवाल
perl
पर्ल एक प्रक्रियात्मक, उच्च-स्तरीय, सामान्य-प्रयोजन, गतिशील प्रोग्रामिंग भाषा है, जिसे नियमित अभिव्यक्ति और स्ट्रिंग पार्स क्षमताओं के मूल समर्थन के लिए जाना जाता है। कृपया सामान्य रूप से पर्ल के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। नई (लेकिन संबंधित) भाषा Raku (पूर्व में "पर्ल 6") से संबंधित चीजों के लिए, कृपया raku टैग का उपयोग करें। अन्य भाषाओं में पर्ल-स्टाइल नियमित अभिव्यक्तियों के लिए, रेगेक्स टैग का उपयोग करें, या, यदि वे पीसीआरई लाइब्रेरी, पीसीआर टैग पर आधारित हैं।