अन्य विशिष्ट मैच तक प्रत्येक grep मैच के बाद लाइनें कैसे दिखाएं?


44

मुझे पता है कि "-A NUM"स्विच का उपयोग करके मैं प्रत्येक मैच के बाद विशिष्ट संख्या में अनुगामी लाइनों को प्रिंट कर सकता हूं। मैं सोच रहा था कि क्या प्रत्येक मैच के बाद एक विशिष्ट शब्द मिलने तक अनुगामी लाइनों को प्रिंट करना संभव है। उदाहरण के लिए, जब मैं "वर्ड ए" खोजता हूं, तो मैं "वर्ड ए" वाली लाइन को देखना चाहता हूं और इसके बाद की पंक्तियों को भी "वर्ड डी" वाला होना चाहिए।

संदर्भ:

Word A
Word B
Word C
Word D
Word E
Word F

आदेश:

grep -A10 'Word A'

मुझे इस आउटपुट की आवश्यकता है:

Word A
Word B
Word C
Word D

जवाबों:


73

ऐसा लगता है कि आप ' Word A' और ' Word D' (समावेशी) के बीच की रेखाएँ छापना चाहते हैं । मैं आपको sedइसके बजाय उपयोग करने का सुझाव देता हूं grep। यह आपको इनपुट स्ट्रीम की एक श्रृंखला को संपादित करने की अनुमति देता है जो आपके इच्छित पैटर्न के साथ शुरू और समाप्त होती है। आपको बस sedसभी लाइनों को प्रिंट करने के लिए कहना चाहिए और कोई अन्य लाइनें नहीं:

sed -n -e '/Word A/,/Word D/ p' file

यह कैसे विशिष्ट बनाने के लिए कोई सुझाव (किसी भी सामान्य स्थिति के लिए, न केवल ओपी के)?
2rs2ts

4
@ 2rs2ts इसे अनन्य बनाने के लिए, बस जोड़ | sed -e '1d;$d'दें, पहली और आखिरी पंक्ति को हटा दें
holroy

और अगर आप बीच की सभी लाइनों को छोड़ना चाहते हैं - यानी, आप केवल उन रेखाओं को देखना चाहते हैं जो दो मैचों के बाहर हैं - तो: sed -n -e '/pattern A/,/pattern D/d; p'यह कहता है, "पैटर्न ए से पैटर्न डी को हटा दें और बाकी सब कुछ प्रिंट करें"। दुर्भाग्य से, यह मैच लालची है। इसका मतलब है कि यदि पैटर्न ए और डी एक से अधिक बार दिखाई देते हैं, तो आप पहले पैटर्न ए से आखिरी पैटर्न डी से मैच करने जा रहे हैं । मुझे डर है कि अगर मामला है तो मैं पर्ल या पायथन आपके दोस्त हूं।
fbicknel

16

क्यों नहीं awk का उपयोग करें?

awk '/Word A/,/Word D/' filename

2
यदि बड़ी संख्या में फाइलें शामिल हैं, तो sed इसे और अधिक कुशलतापूर्वक करने में सक्षम प्रतीत होता है। जाग याद करने में आसान हो सकता है, लेकिन मेरे मस्तिष्क में एक चिपचिपा नोट के लिए sed लगता है।
जिमनिम

1
awk श्रेष्ठ है यदि Word Dएक ही रेखा पर गिरता है Word A, और संभवतः कहीं और है, जैसे Word A Word D\nWord Dकि sed के साथ दो रेखाएँ दिखाई देंगी जहाँ awk एक दिखाएगा। इसके अलावा, एक अभी भी चर के साथ चर का उपयोग कर सकते हैं, उदाहरण के लिए awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", इसलिए शायद sed अधिक कुशल है, लेकिन जब दो तार की खोजों के साथ काम कर रहे हैं जो एक ही लाइन पर पड़ सकते हैं या नहीं, तो awk निश्चित रूप से अधिक विश्वसनीय होंगे।
S0AndS0

ऐसा लगता है कि awk बेहतर लगता है मामला उस फ़ाइल के दृश्यों में शामिल है संभालती है Aऔर Bऔर आप केवल क्या ऐसे प्रत्येक अनुक्रम के बीच है पर कब्जा करना चाहते हैं। ऐसा लगता है कि सेड कम से कम मेरे मामले में इन शब्दार्थों का पालन नहीं करता है।
मटन

9
perl -lne 'print if /Word A/ .. /Word D/' file

या

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
+1 ड्राइव-डाउन डाउनवोट का मुकाबला करने के लिए। मैं sedतब भी इसके लिए उपयोग करूंगा , जब तक कि आपको परिसीमन लाइनों का चयन करने के लिए पर्ल की नियमित अभिव्यक्ति की शक्ति की आवश्यकता न हो।
ट्रिपल

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