2009-08-04 7 views
11

[संपादकीय प्रविष्टि: एक ही पोस्टर के earlier question की संभावित डुप्लिकेट?]बैश ग्रेप न्यू लाइन

हाय, मैं फ़ाइल से निकालने के लिए की जरूरत है: ग्रेप आदेश का उपयोग

first 
second 
third 

, निम्न पंक्ति :

second 
third 

grep कमांड कैसा दिखना चाहिए?

+0

से भी छुटकारा पायेगा क्या आपका मतलब शाब्दिक है या क्या आपका मतलब है कि आप दूसरी और तीसरी पंक्ति चाहते हैं, कोई फर्क नहीं पड़ता उनके पास क्या सामग्री है? इसके अलावा, क्या यह आपका होमवर्क है? – Telemachus

+0

मेरा होमवर्क नहीं, बस एक कार्य है। मुझे नहीं पता कि नियमित रूप से नियमित अभिव्यक्ति कैसे बनाएं। – Markus

+1

मैं जो चाहता हूं वह एक नियमित अभिव्यक्ति बनाना है जिसमें एक न्यूलाइन कैरेक्टर होगा। – Markus

उत्तर

1

लाइन? या लाइनें? ग्रेप लाइन बिछाई गई है:

grep -E -e '(second|third)' filename 

संपादित की कोशिश करो। आपको लाइनों में पैटर्न मिलान करने के लिए या तो पर्ल, sed या awk का उपयोग करना होगा।

बीटीडब्ल्यू-ई grep बताओ कि regexp विस्तारित आरई है।

+0

लाइन्स। लेकिन एक नियमित अभिव्यक्ति बनाने के बारे में क्या है जिसका उपयोग egrep द्वारा किया जाएगा? कैसे नया लाइन चरित्र का प्रतिनिधित्व किया जाता है? – Markus

+0

'egrep' दूसरा \\ nthird 'filename' –

0
grep -E '(second|third)' /path/to/file 
egrep -w 'second|third' /path/to/file 
2

मुझे वास्तव में समझ में नहीं आता कि आप क्या मिलान करना चाहते हैं। मैं ग्रेप का उपयोग नहीं होगा, लेकिन के बाद एक:

tail -2 file   # to get last two lines 
head -n +2 file  # to get all but first line 
sed -e '2,3p;d' file # to get lines from second to third 

(यकीन नहीं है कि यह कैसे मानक है, यह सुनिश्चित करें कि के लिए जीएनयू उपकरण में काम करता है)

+0

मैं सहमत हूं। grep वास्तव में इस पर जाने का सही तरीका नहीं है। – Jim

8

आपका प्रश्न सार "बैश ग्रेप न्यू लाइन", संकेत मिलता है कि आप second\nthird अक्षरों के अनुक्रम पर मिलान करना चाहते हैं - यानी इसमें कुछ नई रेखा शामिल है।

चूंकि grep "लाइनों" पर काम करता है और ये दोनों अलग-अलग रेखाएं हैं, तो आप इसे इस तरह से मिलान नहीं कर पाएंगे।

तो, मैं इसे कई कार्यों में विभाजित हैं:

grep -A 1 "second" testfile 
  • :

    1. आप लाइन है कि होता है "दूसरी" और उत्पादन लाइन है कि मिलान किया गया है और बाद में लाइन से मेल खाते हैं

      आप प्रत्येक अन्य नई लाइन को अनुक्रम में अनुवाद करते हैं जो इनपुट में होने की गारंटी नहीं है।मुझे लगता है कि का उपयोग करेंगे पर्ल करने के लिए सबसे आसान तरीका:

      perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;' 
      
    2. आप इन पंक्तियों पर एक ग्रेप करते हैं, इस समय स्ट्रिंग ##UnUsedSequence##third के लिए खोज:

      grep "##UnUsedSequence##third" 
      
    3. आप अप्रयुक्त दृश्यों वापस खोलने

      sed -e 's/##UnUsedSequence##/\n' 
      

    तो: नई-पंक्तियों में, SED सरल हो सकता है परिणामी पाइप कमांड जो आप चाहते हैं उसे करने के लिए:

    grep -A 1 "second" testfile | perl -npe '$x=1-$x; s/\n/##UnUsedSequence##/ if $x;' | grep "##UnUsedSequence##third" | sed -e 's/##UnUsedSequence##/\n/' 
    

    अब तक का सबसे सुरुचिपूर्ण नहीं है, लेकिन काम करना चाहिए। मैं बेहतर दृष्टिकोण जानने के लिए उत्सुक हूं, हालांकि - कुछ होना चाहिए।

  • 1

    तो क्या आप बस "पहले" वाली रेखा नहीं चाहते हैं? -v grep परिणाम inverts।

    $ echo -e "first\nsecond\nthird\n" | grep -v first 
    second 
    third 
    
    3

    मुझे नहीं लगता कि ग्रेप इस पर जाने के लिए रास्ता है।

    यदि आप किसी भी फ़ाइल से पहले पंक्ति को पट्टी करना चाहते हैं (अपने प्रश्न को सामान्यीकृत करने के लिए), तो मैं sed का उपयोग करूंगा।

    sed '1d' INPUT_FILE_NAME 
    

    यह फ़ाइल की सामग्री को पहली पंक्ति के साथ मानक आउटपुट में भेज देगा।

    फिर आप परिणामों को कैप्चर करने के लिए मानक आउटपुट को दूसरी फ़ाइल में रीडायरेक्ट कर सकते हैं।

    sed '1d' INPUT_FILE_NAME > OUTPUT_FILE_NAME 
    

    ऐसा करना चाहिए।

    आप ग्रेप और बस का उपयोग करने के पहले उस पर के साथ लाइन प्रदर्शित करने के लिए नहीं करना चाहती है, तो यह प्रयास करें:

    grep -v first INPUT_FILE_NAME 
    

    -v स्विच गुजर करके, आप grep आपको लेकिन अभिव्यक्ति जो आप पारित कर रहे हैं, दिखाने के लिए कह रहे हैं। असल में मुझे सबकुछ दिखाएं लेकिन लाइनें के साथ पहले में दिखाएं।

    हालांकि, नकारात्मकता यह है कि एकाधिक पहले के साथ एक फ़ाइल उस अन्य पंक्तियों को नहीं दिखाएगी और ऐसा व्यवहार नहीं हो सकता है जिसकी आप उम्मीद कर रहे हैं।

    एक नई फ़ाइल में परिणाम अलग धकेलना करने के लिए, इस प्रयास करें:

    grep -v first INPUT_FILE_NAME > OUTPUT_FILE_NAME 
    

    आशा इस मदद करता है।

    +0

    मुझे लगता है कि आपके पिछले दो उदाहरण पीछे हो सकते हैं। – Telemachus

    +0

    इसे पकड़ने के लिए धन्यवाद। – Jim

    20

    के बजाय grep, आप pcregrep जो समर्थन करता है बहु पैटर्न

    pcregrep -M 'second\nthird' file 
    

    -M पैटर्न एक से अधिक पंक्ति मिलान करने के लिए अनुमति देता है का उपयोग कर सकते हैं।

    +4

    आप फ़ाइल में लाइन समाप्ति के आधार पर '\ n' के स्थान पर' \ s + 'का उपयोग करना चाह सकते हैं (कुछ '\ r \ n' हो सकते हैं) – davemyron

    0

    आप

    $ grep -1 third filename 
    

    इस का उपयोग पहले और बाद में मैच और एक तार के साथ एक स्ट्रिंग प्रिंट होगा सकता है। चूंकि "तीसरा" अंतिम स्ट्रिंग में है, तो आपको पिछले दो तार मिलते हैं।

    0

    मैं notnoop's answer पसंद है, लेकिन AndrewY's answer पर निर्माण (जो pcregrep बिना उन लोगों के लिए बेहतर है, लेकिन जिस तरह से बहुत ही जटिल है), तो आप सिर्फ कर सकते हैं:

    RESULT=`grep -A1 -s -m1 '^\s*second\s*$' file | grep -s -B1 -m1 '^\s*third\s*$'` 
    
    0
    grep -v '^first' filename 
    

    -v झंडा कहाँ मैच उलट ।

    1

    grep -A1 "दूसरा" | grep-b1 "तीसरा" अच्छी तरह से काम करता है, और यदि आपके पास एकाधिक मिलान हैं तो यह मूल-मिलान डेलीमीटर