2012-11-23 10 views
27

grep के साथ मुझे पता है कि संदर्भ को निश्चित पंक्तियों में कैसे सेट करें। क्या मनमाने ढंग से स्ट्रिंग स्थिति के आधार पर एक संदर्भ दिखाना संभव है, जैसे "अगली खाली रेखा तक" संदर्भ के बाद सेट करें?"अगली खाली रेखा तक" संदर्भ के बाद मैं grep कैसे सेट कर सकता हूं?

या संभवतः उपकरण के कुछ अन्य संयोजन?

मूल रूप से मैं "घटनाओं" को अलग मैं लॉग फ़ाइल में एक स्ट्रिंग के लिए खोज है, लेकिन पूरी घटना दिखाना चाहते हैं खाली लाइनों के साथ सटे लाइनों की एक लॉग फ़ाइल है, ....

+0

यह अन्य उपकरणों के साथ संभव है। यदि आप एक उदाहरण पोस्ट करते हैं, तो आपको विशिष्ट उत्तर मिलेंगे। –

+0

शायद आप इसके लिए 'sed' या' awk' का उपयोग करना चाहते हैं ... – dmckee

+0

मैं इसके विपरीत कैसे कर सकता हूं। मेरे पास कॉल स्टैक के साथ एक लॉग फ़ाइल है। मैं एक कॉल स्टैक मुद्रित नहीं करना चाहता हूं लेकिन सभी अन्य कॉल स्टैक – Nikole

उत्तर

24

यह की तरह लगता है आप sed की जरूरत है:

sed -n '/pattern/,/^$/p' file 

डिफ़ॉल्ट (-n) द्वारा मुद्रित न करें। /pattern/ से मेल खाने वाली रेखाओं के लिए /^$/ पर एक खाली रेखा तक प्रिंट करें।

awk '/pattern/ {do_print=1} 
    do_print==1 {print} 
    NF==0 {do_print=0}' input_file 

यह स्क्रिप्ट भी रिक्त पंक्ति तो यह आसान है नेत्रहीन अलग मिलान किया ब्लॉक अलग करने के लिए प्रिंट होगा:

+0

ध्यान दें कि यह पूरी घटना नहीं दिखाता है, लेकिन पिछले पैटर्न के उन पंक्तियों को याद करता है। –

+2

साफ़ करने के लिए: आदेश ', ' प्रारूप का प्रारूप है। इसमें 'पैटर्न' के एक मैच से शुरू होने वाली समावेशी पता श्रेणियां (रेखा श्रृंखलाएं) और निम्न खाली रेखा (मिलान '^ $') के मिलान के साथ समाप्त होती है। प्रत्येक श्रेणी समारोह के लिए निष्पादित किया जाता है ('पी': आने वाली लाइनों को मुद्रित करें)। आउटपुट उपयोग 'sed -n'/pattern /,/^ $/{/^$ /! P} 'file' से खाली लाइनों को बाहर करने के लिए। यहां '/^$ /! P' का अर्थ है किसी आने वाली पंक्ति को'^$ 'से मेल नहीं करना। – valid

+1

यह एक अपवाद के साथ मेरे लिए पूरी तरह से काम करता है: मेरे स्रोत इनपुट में डॉस-स्टाइल न्यूलाइन (\ r \ n) थी, इसलिए मुझे इसके बजाय ऐसा करना पड़ा: 'sed -n'/pattern /,/^ \ r $/p 'फाइल' – bmaupin

7

यहाँ एक (परीक्षण किया) awk समाधान, पठनीयता के लिए कई पंक्तियों पर अलग है। आप रिक्त पंक्ति नहीं करना चाहते हैं, स्वैप 2 लाइनों do_print==1 {print} और NF==0 {do_print=0}

स्पष्टीकरण:

  • awk: awk उपकरण आह्वान - यह एक समय क्रमिक रूप से इनपुट एक पंक्ति मूल्यांकन करता है।
  • '...'.: सिंगल कोट्स से जुड़ी सब कुछ awk को निर्देशों के रूप में दी गई है। इस मामले में हम प्रत्येक पंक्ति पर उद्धृत निर्देश प्रदर्शन करते हैं।
  • /pattern/ {do_print=1}: जब भी कोई लाइन "pattern" शामिल हैं, do_print झंडा
  • do_print==1 {print} पर बारी: अगर do_print ध्वज को पर सेट किया गया है, वर्तमान पंक्ति मुद्रित करें।
  • NF==0 {do_print=0}: एनएफ फ़ील्ड की संख्या के लिए खड़ा है। awk फ़ील्ड में लाइन को तोड़ने के लिए डिफ़ॉल्ट रूप से रिक्त स्थान और टैब द्वारा प्रत्येक पंक्ति को सीमित करता है। इस मामले में तुच्छता से एक रिक्त पंक्ति कोई फ़ील्ड है - तो हम मुद्रण को रोकने के लिए do_print झंडा बंद कर देते हैं जब हम NF == 0
18

के साथ एक पंक्ति को देखने के एक सरल समाधान है:

awk '/pattern/' RS= input-file 

करने के लिए सेटिंग रुपये रिक्त स्ट्रिंग रिकॉर्ड विभाजक के रूप में बहुत ही रिक्त रेखाएं बनाती है, और सरल नियम /pattern/ पैटर्न से मेल खाने वाले किसी भी रिकॉर्ड को मुद्रित करने के लिए अजीब होता है, जो कि किसी भी विस्तारित नियमित अभिव्यक्ति हो सकता है।

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

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