2011-02-03 16 views
5

निम्नलिखित है कि मैं awk का उपयोग करने की कोशिश कर रहा हूं। उस रेखा को प्राप्त करें जो मिलान और प्रिंट से ठीक पहले रेगेक्स और रेखा से मेल खाता हो। अगर आप का उपयोग करने के लिए की जरूरत है,मिलान से पहले अजीब प्रिंट मिलान रेखा और रेखा

grep -B1 foo file 

हालांकि:

awk '{if ($0!~/^CGCGGCTGCTGG/) print $0}' 
+0

चलें मान लीजिए लाइनों 3 और 4 मैच regex। क्या आप 2,3,4 दिखाना चाहते हैं? –

उत्तर

10

इस मामले में आप आसानी से ग्रेप साथ इसे हल कर सकते हैं: मुझे लगता है कि regex मिलान किया लाइन लेकिन तुरंत लाइन नहीं है कि इससे पहले कि प्राप्त कर सकते हैं awk:

awk '/foo/{if (a && a !~ /foo/) print a; print} {a=$0}' file 
+0

awk '{if ($ 0 ~ /> /) head = $ 0; getline} {if ($ 0 ~/^ CGCGGCTGCTGG /) प्रिंट हेड "\ n" $ 0}' .. यह सही है ?? – Sudeep

+0

@ सुदीप: आप स्वयं को बता सकते हैं कि यह परीक्षण करके सही है या नहीं ... लेकिन मार्को के सुझाव से समझना लंबा और कठिन है, तो परेशान क्यों? – Cascabel

+0

धन्यवाद जेरोमी, हाँ, मैं परीक्षण कर सकता हूं ... मैं हूं, लेकिन गेटलाइन थोड़ा उलझन में था, इसलिए मैंने यह देखने के लिए पोस्ट किया कि कोई आदेश देखता है और ध्वज उठा सकता है :) – Sudeep

0

का प्रयोग क्यों न grep -EB1 '^CGCGGCTGCTGG'

awk वही काम करने के लिए बहुत लंबा हवादार है, मार्को का जवाब देखें।

+0

धन्यवाद मार्को और सोलमोजो..ग्रेप भी काम करता है, बस अजीब में करने के लिए waned। – Sudeep

+0

एक सीखने के अभ्यास के रूप में, यह करने के लिए एक अच्छी बात है, हालांकि, grep भी तेजी से चलाएगा, और बॉयोमीट्रिक्स पर जो शायद एक उपयोगी सुविधा है। – ocodo

2
/abc/{if(a!="")print a;print;a="";next} 
{a=$0} 
+0

आपकी स्क्रिप्ट "bcd \ nabc \ nabcdef" –

+0

जैसे किसी मामले को ठीक से संभाल नहीं पाएगी। –

1

उपयोग और अधिक सरल पैटर्न खोज

gawk '{if (/^abc$/) {print x; print $0};x=$0}' file1 > file2

0

शायद थोड़ा विषय से हटकर है, लेकिन मैं इसके बाद के संस्करण समाधान के अपने ही भिन्नता, खोज करता है बनाने के लिए बेलिसारियस से जवाब के लिए इस्तेमाल किया एनएच एंट्री, और उस और पिछली लाइन को लौटाता है।

awk -v count=1 '/abc/{{i++};if(i==count){print a;print;exit}};{a=$0}' file 
1

मैंने निम्नलिखित awk स्क्रिप्ट बनाई है। मिलान रेखा के साथ-साथ पिछली 2 पंक्तियों को प्रिंट करता है। आप इसे इस विचार से अधिक लचीला बना सकते हैं।

search.awk

{ 
    a[0]=$0; 
    for(i=0;i<2;i++) 
    { 
     getline; 
     if(i==0){ 
      a[1]=$0; 
     } 
     if(i==1){ 
      if($0 ~ /message received/){ 
       print a[0];  
       print a[1]; 
       print $0; 
      } 
     } 
    } 
} 

उपयोग:

awk '{print $0}' LogFile.log | awk -f search.awk 
संबंधित मुद्दे