कुछ पाठ खोजने के बाद कुछ पंक्तियों को कैसे पढ़ें?


12

कुछ पाठ खोजने के बाद मैं एक निश्चित संख्या में लाइनें कैसे पढ़ सकता हूं?

उदाहरण के लिए .:

"यूनिक्स" खोजने के बाद अगली 2 पंक्तियाँ पढ़ें:

Test 1
Test 2
Test 3
Test 4
UNIX
Test 5
Test 6
Test 7
Test 8
Test 9

परिणाम हो सकता है:

Test 5
Test 6

नोट: अंतिम उदाहरण पर "यूनिक्स" एक तर्क है, और इसलिए, यह किसी भी अन्य पाठ हो सकता है।

जो मेरे पास है:

मैं अभी भी विचारों से बाहर हूं, बस एक रोशनी की जरूरत है। ऐसा करने के लिए एक और स्क्रिप्ट बनाने पर विचार कर रहा है।

जवाबों:


10

एक awkसमाधान:

$ awk '$0 == "UNIX" {i=1;next};i && i++ <= 2' file
Test 5
Test 6

व्याख्या

  • /^UNIX$/{i=1;next}: यदि हम देखते हैं UNIX, तो हम i = 1अगले इनपुट पर परिवर्तनशील , प्रसंस्करण सेट करते हैं ।

  • यदि चर iसेट किया गया है (जिसका अर्थ है कि हमने देखा था UNIX), i && i++ <= 2केवल बाद में दो लाइनों में सही मान का मूल्यांकन किया UNIX, जिससे awkडिफ़ॉल्ट कार्रवाई की गई print $0

  • देखने से पहले UNIX, iपरिभाषित नहीं किया गया था और 3 जी लाइन पर शुरू होने के बाद UNIX, i2 से अधिक मूल्य था, जो कि i && i++ <= 2झूठी का मूल्यांकन किया जाता है, जिससे awkकुछ भी नहीं होता है।


परीक्षण के बाद आप इस त्रुटि संदेश का समाधान कर रहे हैं: लाइन 1 के पास त्रुटि सिस्टैक्स लाइन 1 के पास से बाहर निकल रहा है
कोल्ड

@ कॉल्ड: आपने क्या चलाया? कृपया ध्यान दें कि $मेरे उत्तर की शुरुआत में संकेत शेल प्रांप्ट है, awkकमांड का हिस्सा नहीं है ।
14

एक अन्य प्रकार:awk '/^UNIX$/ {s=NR;next} s && NR<=s+2'
मस्तफिल

मुझे पता है कि @cuonglm
कोल्ड

@ कॉल्ड: आपका ओएस क्या है?
cuonglm

12

एक grepसमाधान:

grep -A2 -P '^UNIX$' file

स्पष्टीकरण: का -A अर्थ है: मैच के बाद अगली दो पंक्तियों को प्रिंट करें

या awk:

awk '$0=="UNIX"{getline; print; getline; print}' file

स्पष्टीकरण: यह कथन लाइन में UNIX के लिए खोज करता है ( $0=="UNIX")। यदि वह दिया जाता है तो यह उसके बफर ( getline) में अगला हो जाता है और बफर ( ) को प्रिंट करता है print। यह दो बार किया जाता है।

या उपयोग करें sed:

sed -n '/^UNIX$/{n;p;n;p}' file

स्पष्टीकरण: UNIX ( /^UNIX$/) के लिए यह खोज है । यदि यह पाया जाता है तो यह उस भाग को txecute करता है {...}nअगले का मतलब है, pप्रिंट का मतलब है। यह दो बार भी किया जाता है।


धन्यवाद @ अचल, मैं आपके द्वारा दिए गए अंतिम 2 विकल्प की कोशिश करूंगा। कृपया प्रत्येक विकल्प के कुछ स्पष्टीकरण को संलग्न करें, मैं winna compreend और करूँगा।
कोल्ड

यदि लाइनों की संख्या बदलती है, तो मैं पिछले दो विकल्पों में कितने बदलाव करूंगा? साभार
कोल्ड

@ बताइए मेरा संपादन देखिए। संख्या बदलने के लिए यदि रेखाएँ कथन में भाग या कथन getline; print;में भाग दोहराती हैं । awkn;p;sed
अराजकता

धन्यवाद @ अचल, लेकिन उच्चतर लाइनों की संख्या में वृद्धि हुई अभिव्यक्ति है और मेरे विचार में परिवर्तन संभव नहीं है। आपको नहीं लगता? यदि 100 रेखाएँ?
कोल्ड

@ बताया तब मैं grep समाधान का उपयोग करूंगा grep -A100 -P '^UNIX$' file | tail -n +2। पूंछ का हिस्सा पहले ग्रहणाधिकार को निकालना है। दूसरों में (sed, awk) आपको लूप लिखना होगा, जो इसे कम सरल बनाता है।
अराजकता

4
grep -A 2 UNIX file.txt

Grep का मेनपेज इस प्रकार विकल्प का वर्णन करता है:

  -A NUM, --after-context=NUM
      Print NUM  lines  of  trailing  context  after  matching  lines.
      Places  a  line  containing  --  between  contiguous  groups  of
      matches.

हाय @Twinkles, अच्छा जवाब है, लेकिन मेरे grep में केवल यही विकल्प हैं "hblcnsviw"। लेकिन लॉजिक्स अच्छा है। धन्यवाद
कोल्ड

यह UNIXआउटपुट में भी प्रिंट होगा ।
cuonglm

से बाहर निकलने के लिए UNIX, इसे पाइप करें tail: [...] | tail -n +1या sed: से [...] | sed '1d'
डोपघोटी

1
@ डोपघोटी: आपके tailऔर sed '1d'सुझाव सही ढंग से काम करते हैं, यदि UNIXकेवल एक बार इनपुट टेक्स्ट में दिखाई देता है। अन्य सभी उत्तर कई घटनाओं के लिए अनुमति देते हैं। यह सुझाव देना बेहतर हो सकता है ... | grep -v UNIX। माना जाता है कि, अगर यह UNIXरेखा 15 और 17 पर दिखाई देती है, तो गड़बड़ हो जाती है ।
जी-मैन कहते हैं, 'मोनिका'

अच्छे अंक। मुझे पूरा यकीन है कि यह सिर्फ sedकिसी न किसी रूप में किया जा सकता है sed '/UNIX/d;n;n;p/' /path/to/file, जिसे मैंने अभी बाहर कर दिया और जवाब के रूप में प्रस्तुत किया।
डोपघोटी

0

यह चाल अच्छी तरह से करने के लिए लगता है:

sed -n '/UNIX/{n;p;n;p}' /path/to/file

अवधारणा के सुबूत:

$ for i in {1..9}; do echo $i; done | sed -n '/4/{n;p;n;p}'
5
6

1
आपके forलूप के आसपास की सबस्क्रिप्शन आवश्यक नहीं है।
अगली सूचना तक रोक दिया गया।

वास्तव में यह नहीं है; यह उस दिन के पहले दिन मैं उस खोल के बीच में था। परेंस निकाले।
डोपगोटी

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