2011-06-08 12 views
26

मैंने पहले और बाद में grepping लाइनों के कुछ उदाहरण देखे हैं, लेकिन मैं मध्य रेखाओं को अनदेखा करना चाहता हूं। तो, मुझे पहले पांच पंक्तियों की रेखा चाहिए, लेकिन कुछ भी नहीं। क्या यह किया जा सकता है?मैं 'grep' को grepped लाइन के ऊपर एक पंक्ति पांच पंक्तियों को कैसे दिखा सकता हूं?

+0

प्रश्न स्पष्ट नहीं है, क्या यह मिलान से पहले 5 लाइन है, या – CharlesB

+0

मैच से पहले 5 लाइनें http://stackoverflow.com/questions/9081/grep-a-file-but-show-several-surrounding- लाइन – Vadzim

+0

यह टिप्पणी देर से आ रही है, लेकिन खुद से पूछें: एक बार जब आपने "संदर्भ रेखा" और पांच पिछले 'grep-b5 "foo" file' के साथ पहचाना है, तो उस पंक्ति के अलावा कुछ अन्य डायग्नोस्टिक है जो 5 है पहले लाइनें? उदाहरण के लिए, क्या आप एक विशेष त्रुटि की तलाश में हैं, और प्रक्रिया आईडी वापस करना चाहते हैं? फिर शायद 'grep-b5 "foo" फ़ाइल | grep "bar" 'सबसे आसान बात हो सकती है। –

उत्तर

27

ठीक है, मुझे लगता है कि यह वही करेगा जो आप खोज रहे हैं। यह एक पैटर्न की तलाश करेगा, और प्रत्येक मैच से पहले 5 वीं लाइन निकालें।

grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }' 

इस मूल रूप से कैसे काम करता है यह पहली पंक्ति लेता है, यह प्रिंट, और उसके बाद जब तक यह ^--$ (मैच ग्रेप द्वारा प्रयोग किया जाता विभाजक) देखता है इंतजार कर रहा है, और फिर से शुरू होता है।

+0

बिल्कुल सही! धन्यवाद – mike628

+2

अरे क्रिस, एक अजीब उपयोगकर्ता नहीं, लेकिन मैं इसे थोड़ा बेहतर समझना चाहता हूं। क्या आप अजीब भाग को विस्तार से समझा सकते हैं। मैंने ऑनलाइन ट्यूटोरियल पर एक गुच्छा देखा और इनमें से कुछ मैं समझ नहीं पाया। – mike628

+1

अगर मैं इसे अजीब के साथ हल करने जा रहा था, तो यह 'grep-b5 "पैटर्न" फ़ाइल नाम "करने के लिए और अधिक सीधे आगे हो सकता है। awk '{mod = एनआर% 7; अगर (mod == 1) {प्रिंट $ 0}} ''। 7 क्योंकि 1 मिलान पंक्ति + 5 संदर्भ पंक्तियां + 1 विभाजक पंक्ति। आउटपुट की पहली पंक्ति एक विभाजक पंक्ति होगी, इसलिए ब्याज की पंक्ति दूसरी 7 वीं पंक्ति होगी, जो दूसरे के साथ शुरू होगी। एनआर एक शून्य-आधारित पंक्ति संख्या है जो आपको स्वचालित रूप से देता है। '-12' के लिए –

9

यह विकल्प -B है

-B NUM, --before-context=NUM 
    Print NUM lines of leading context before matching lines. 
    Places a line containing -- between contiguous groups of 
    matches. 
+0

हालांकि यह आवश्यकता को पूरा नहीं करता है - यह सभी इंटरमीडिएट लाइनों को भी दिखाता है। – Cybergibbons

4

आप केवल 5 वीं पंक्ति मैच से पहले आप यह कर सकते हैं करना चाहते हैं:

grep -B 5 pattern file | head -1 

संपादित करें:
यदि आपके पास एक से अधिक मैच हो सकते हैं, तो आप इसे आजमा सकते हैं (pattern अपने वास्तविक पैटर्न के साथ एक्सचेंज करें):

sed -n '/pattern/!{H;x;s/^.*\n\(.*\n.*\n.*\n.*\n.*\)$/\1/;x};/pattern/{x;s/^\([^\n]*\).*$/\1/;p}' file 

मैं एक Sed tutorial, अनुभाग से ले लिया: Keeping more than one line in the hold buffer, उदाहरण के 2 और यह थोड़ा अनुकूलित।

+0

यह केवल पहले मैच के लिए काम करता है, किसी भी बाद के मैचों को फेंक दिया जाएगा। –

+0

मैंने इसे दूसरा रास्ता जोड़ा - इस बार यह एक से अधिक मैच के साथ भी काम करता है। – bmk

1

इस तरह मेरे लिए आसान है:

grep --no-group-separator -B5 "pattern" file | sed -n 1~5p 

यह greps 5 लाइनों से पहले और पैटर्न सहित --- समूह विभाजक बंद हो जाती है, तो हर 5 लाइन प्रिंट करता है।

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