मेरे पास एक लॉग फ़ाइल है जहाँ त्रुटियों का उल्लेख पंक्ति की शुरुआत में "ERROR" के रूप में किया जाएगा और अगली पंक्ति में त्रुटि के बारे में विस्तृत पाठ होगा। मैं फ़ाइल में "त्रुटि" की अंतिम घटना की खोज करना चाहता हूं ताकि मैं अंतिम त्रुटि ढूंढ सकूं और अगली पंक्ति प्रिंट कर सकूं या प्रतिलिपि एक चर के लिए रेखा है।

खोल में, मैं नीचे दिए गए आदेश को आजमा सकता हूं जो मुझे इसे प्राप्त करने में मदद करेगा। क्या कोई मुझे समकक्ष पर्ल कोड दे सकता है?

Grep -A1 त्रुटि sapinst.log | पूंछ -2

चूंकि लॉग फ़ाइल बड़ी होगी (~ 5000+ लाइनें), इसलिए मैं इसे किसी सरणी में संग्रहीत नहीं करना चाहता हूं।

-1
Subhashree Kanungo 16 मार्च 2020, 07:18
1
पुन: "चूंकि लॉग फ़ाइल बहुत बड़ी होगी (~5000+ लाइनें)", वह क्या है, 500 KiB? यह बहुत बड़ा नहीं है; वह छोटा है!
 – 
ikegami
16 मार्च 2020, 07:25
पुन: "क्या कोई मुझे समकक्ष पर्ल कोड दे सकता है?", आपके पास पहले से मौजूद कोड में क्या गलत है? यदि आप हमें नहीं बताते कि यह क्या है, तो हम इसे पर्ल में भी करने से कैसे बच सकते हैं?
 – 
ikegami
16 मार्च 2020, 07:29
हाय इकेगामी, मैं अपने पर्ल कोड के अंदर शेल स्क्रिप्ट का उपयोग नहीं करना चाहता।
 – 
Subhashree Kanungo
19 मार्च 2020, 06:20
नमस्ते, मैं उस लाइन को प्रोंग करना चाहता हूं जिसमें "ERROR" और उसके बाद की अगली लाइन है।
 – 
Subhashree Kanungo
19 मार्च 2020, 10:52

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

यह शायद एक सुधार है।

1
ikegami 19 मार्च 2020, 11:28
ओपी के समायोजन के जवाब में मेरा जवाब समायोजित किया।
 – 
ikegami
19 मार्च 2020, 11:29

लाइनों के 2 लंबे बफर आज़माएं:

my $match = "no error found";
my @a = ("", "");
while (<STDIN>) {
    @a = ($a[1], $_);
    $match = $a[1] if $a[0] =~ /^ERROR/i;
}
print $match;

यह अंतिम त्रुटि प्रिंट करता है (या "कोई त्रुटि नहीं मिली")। सभी त्रुटियों को प्राप्त करने के लिए, असाइनमेंट को लूप में मिलान करने के लिए प्रिंट स्टेटमेंट में बदलें।

0
Vincent Lucarelli 19 मार्च 2020, 06:56
हाय विन्सेंट, उपरोक्त कोड काम कर रहा है जब मैंने इसे अपने कोड में शामिल किया। लेकिन मुझे "$a[0] के लिए चेतावनी मिल रही है।" त्रुटि: systemProvisioning.pl लाइन 815, लाइन 1 (#1) (W uninitialized) पर पैटर्न मैच (m//) में uninitialized मान $arr1[0] का उपयोग एक अपरिभाषित मान का उपयोग किया गया था जैसे कि यह पहले से ही था परिभाषित। इसकी व्याख्या "" या 0 के रूप में की गई थी, लेकिन शायद यह एक गलती थी। इस चेतावनी को दबाने के लिए अपने चरों के लिए एक निर्धारित मान निर्दिष्ट करें।
 – 
Subhashree Kanungo
19 मार्च 2020, 06:18
एक से अधिक मैच होने पर यह काम नहीं करता है। ओपी ने विशेष रूप से कहा कि केवल आखिरी मैच के बाद की लाइनें चाहते हैं।
 – 
ikegami
19 मार्च 2020, 06:35
कोड के ब्लॉक के बाद का वाक्य बताता है कि सिर्फ आखिरी मैच कैसे प्राप्त करें।
 – 
Vincent Lucarelli
19 मार्च 2020, 06:38
- "@a = ("","");" के साथ एक सरणी प्रारंभ करने का प्रयास करें पूरे लूप से पहले।
 – 
Vincent Lucarelli
19 मार्च 2020, 06:42
मैं प्रश्न के उत्तर दोनों को दिखाने की कोशिश कर रहा था और जो मैंने सोचा था वह कोड का संभावित रूप था। अंत में, कोड ब्लॉक के बाद संस्करण का वर्णन किया जाना चाहिए था। इसे अभी अपडेट कर रहे हैं।
 – 
Vincent Lucarelli
19 मार्च 2020, 06:48