मैंने पहले और बाद में grepping लाइनों के कुछ उदाहरण देखे हैं, लेकिन मैं मध्य रेखाओं को अनदेखा करना चाहता हूं। तो, मुझे पहले पांच पंक्तियों की रेखा चाहिए, लेकिन कुछ भी नहीं। क्या यह किया जा सकता है?मैं 'grep' को grepped लाइन के ऊपर एक पंक्ति पांच पंक्तियों को कैसे दिखा सकता हूं?
उत्तर
ठीक है, मुझे लगता है कि यह वही करेगा जो आप खोज रहे हैं। यह एक पैटर्न की तलाश करेगा, और प्रत्येक मैच से पहले 5 वीं लाइन निकालें।
grep -B5 "pattern" filename | awk -F '\n' 'ln ~ /^$/ { ln = "matched"; print $1 } $1 ~ /^--$/ { ln = "" }'
इस मूल रूप से कैसे काम करता है यह पहली पंक्ति लेता है, यह प्रिंट, और उसके बाद जब तक यह ^--$
(मैच ग्रेप द्वारा प्रयोग किया जाता विभाजक) देखता है इंतजार कर रहा है, और फिर से शुरू होता है।
बिल्कुल सही! धन्यवाद – mike628
अरे क्रिस, एक अजीब उपयोगकर्ता नहीं, लेकिन मैं इसे थोड़ा बेहतर समझना चाहता हूं। क्या आप अजीब भाग को विस्तार से समझा सकते हैं। मैंने ऑनलाइन ट्यूटोरियल पर एक गुच्छा देखा और इनमें से कुछ मैं समझ नहीं पाया। – mike628
अगर मैं इसे अजीब के साथ हल करने जा रहा था, तो यह 'grep-b5 "पैटर्न" फ़ाइल नाम "करने के लिए और अधिक सीधे आगे हो सकता है। awk '{mod = एनआर% 7; अगर (mod == 1) {प्रिंट $ 0}} ''। 7 क्योंकि 1 मिलान पंक्ति + 5 संदर्भ पंक्तियां + 1 विभाजक पंक्ति। आउटपुट की पहली पंक्ति एक विभाजक पंक्ति होगी, इसलिए ब्याज की पंक्ति दूसरी 7 वीं पंक्ति होगी, जो दूसरे के साथ शुरू होगी। एनआर एक शून्य-आधारित पंक्ति संख्या है जो आपको स्वचालित रूप से देता है। '-12' के लिए –
यह विकल्प -B है
-B NUM, --before-context=NUM Print NUM lines of leading context before matching lines. Places a line containing -- between contiguous groups of matches.
हालांकि यह आवश्यकता को पूरा नहीं करता है - यह सभी इंटरमीडिएट लाइनों को भी दिखाता है। – Cybergibbons
आप केवल 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 और यह थोड़ा अनुकूलित।
यह केवल पहले मैच के लिए काम करता है, किसी भी बाद के मैचों को फेंक दिया जाएगा। –
मैंने इसे दूसरा रास्ता जोड़ा - इस बार यह एक से अधिक मैच के साथ भी काम करता है। – bmk
इस तरह मेरे लिए आसान है:
grep --no-group-separator -B5 "pattern" file | sed -n 1~5p
यह greps 5 लाइनों से पहले और पैटर्न सहित --- समूह विभाजक बंद हो जाती है, तो हर 5 लाइन प्रिंट करता है।
प्रश्न स्पष्ट नहीं है, क्या यह मिलान से पहले 5 लाइन है, या – CharlesB
मैच से पहले 5 लाइनें http://stackoverflow.com/questions/9081/grep-a-file-but-show-several-surrounding- लाइन – Vadzim
यह टिप्पणी देर से आ रही है, लेकिन खुद से पूछें: एक बार जब आपने "संदर्भ रेखा" और पांच पिछले 'grep-b5 "foo" file' के साथ पहचाना है, तो उस पंक्ति के अलावा कुछ अन्य डायग्नोस्टिक है जो 5 है पहले लाइनें? उदाहरण के लिए, क्या आप एक विशेष त्रुटि की तलाश में हैं, और प्रक्रिया आईडी वापस करना चाहते हैं? फिर शायद 'grep-b5 "foo" फ़ाइल | grep "bar" 'सबसे आसान बात हो सकती है। –