यदि अगली पंक्ति में कोई विशेष मिलान नहीं है, तो केवल एक पंक्ति प्रिंट करें


12

मैं उन लॉग गतिविधियों के लिए एक लॉग फ़ाइल खोजने का प्रयास कर रहा हूं जो पूरी नहीं हुईं। उदाहरण के लिए, मैं "ID 1234 के लिए प्रारंभिक गतिविधि ..." लॉग करता हूं और यदि सफल होता है, तो अगली पंक्ति "गतिविधि 1234 पूरी हो जाएगी।"

मैं "स्टार्टिंग ..." लाइन्स प्राप्त करने की कोशिश कर रहा हूं, जिनका पालन उनकी संगत "कम्प्लीटेड" लाइनों द्वारा नहीं किया जाता है।

उदाहरण लॉग फ़ाइल

Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully

इस उदाहरण में, मैं उत्पादन के लिए देख रहा हूँ:

Starting activity for ID 33367

... क्योंकि यह एक "पूर्ण" लाइन के बाद नहीं है।

मैंने ऐसा करने की कोशिश की है grepऔर awk, लेकिन मुझे बहुत सफलता नहीं मिली है। मुझे लगता है कि यह उन उपकरणों में से एक के साथ किया जा सकता है, लेकिन मेरे grepऔर awkचॉप्स उन्नत नहीं हैं।

मुझे यहां जो परिणाम चाहिए, वह देने के लिए एक त्वरित और विश्वसनीय grepया awkपैटर्न की तलाश है।


मुझे नहीं लगता कि यह grep + awk के साथ आसान है, लेकिन क्या आप थोड़ा सा समझा सकते हैं कि आप ऐसा क्यों कर रहे हैं? सभी चल रही गतिविधियों का एक आउटपुट, उदाहरण के लिए सफलता या नहीं finsihed?
डेसी

@ warl0ck, मैं "समाप्त नहीं" के लिए देख रहा हूँ।
पट्टमूलर

जवाबों:


10

यहाँ एक awkविकल्प है:

awk '
  /^Starting/ { I[$5] = $0                  }
  /^ID/       { delete I[$2]                }
  END         { for (key in I) print I[key] }
' infile

आउटपुट:

Starting activity for ID 33367

Iसाहचर्य सरणी क्या आईडी देखा गया है का ट्रैक रखता है।


यह वास्तव में अच्छी तरह से काम करता है, क्योंकि यह उन स्थितियों को भी समायोजित करता है, जहां "शुरू ..." और "पूर्ण ..." लॉग लाइनें आसन्न / अनुक्रमिक नहीं हैं। धन्यवाद @ थोर!
पट्टमूलर

आपका स्वागत है। यह (लगभग) मनमाने ढंग से आकार के इनपुट के साथ कुशलता से काम करना चाहिए क्योंकि यह केवल आईडी को संग्रहीत करता है और लुकअप समय ओ (1) है।
थोर

अच्छा लगा। केवल एक चीज: जैसा कि मैंने @RobertL ( unix.stackexchange.com/a/243550/135943 ) से सीखा है कि आपको एरे तत्व बनाने के लिए कोई वैल्यू असाइन करने की आवश्यकता नहीं है। तो इसके बजाय I[$5] = 1, आप बस का उपयोग कर सकते हैं I[$5]। (आप मूल्य के बारे में परवाह नहीं करते हैं, आप सिर्फ तत्व को अस्तित्व में लाना चाहते हैं , और बस नामकरण यह पूरा करता है।)
वाइल्डकार्ड

@Wildcard: आप सही हैं, लेकिन ओपी के सवाल और grep जैसे आउटपुट के बाद वह समीक्षा कर रहा है, यह पूरी लाइन और आउटपुट को याद रखने के लिए अधिक उपयुक्त है कि अंत में।
थोर

3
sed '$!N;/\n.*completed/d;P;D' <input

यह आउटपुट से सभी इनपुट लाइनों को हटा देगा जो कि पूरी की गई स्ट्रिंग से मेल खाने वाली लाइन द्वारा अनुसरण नहीं की जाती हैं ।


2

यहाँ आप इसे GNU sed के साथ कैसे कर सकते हैं:

sed -r 'N; /([0-9]+)\n\w+\s+\1/d; P; D' infile
  • N पैटर्न स्पेस में एक और लाइन पढ़ता है।
  • यदि समान पैटर्न मिलते हैं, तो मैच रेगेक्स चेक करता है, यदि पैटर्न पैटर्न हटा दिया गया है ( d) और चक्र फिर से चालू हो गया है।
  • यदि यह मेल नहीं खाता है, तो पैटर्न स्पेस ( P) में पहली पंक्ति को प्रिंट करें और इसे हटाएं ( D)।

मैं यहां कुछ भी विस्तारित नहीं देख सकता ... इसलिए -rजरूरत नहीं है, है ना?
लुई मैडॉक्स

1
@ एलएमएमएक्स: इसकी आवश्यकता है क्योंकि अन्यथा कैप्चर ग्रुप को भागने की जरूरत है, और वही +क्वांटिफायर के लिए जाता है ।
थोर

आह अच्छा! मैंने इसे संशोधित किया और बताया गया कि यह आवश्यक नहीं है, स्पष्ट करने के लिए धन्यवाद
लुई मैडॉक्स

1

यदि आपका इंस्टॉलेशन pcregrep को सपोर्ट करता है, तो बहुस्तरीय (-M) विकल्प काम में आता है।

pcregrep -M -o '\AStarting activity for ID (\d+)\n(?!ID \1)' t.z

ID 33367 के लिए गतिविधि शुरू करना

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