2011-02-03 13 views
5

Aşağıda awk kullanarak yapmaya çalıştığım şey. Eşleşen ve yazdırılmadan hemen önce regex ve satır ile eşleşen satırı alın. Kullanmak gerekiyorsa,awk yazdırma eşleştirme satırı ve satırı eşleştirmeden önce

grep -B1 foo file 

Ancak: kolayca grep ile çözebilir Bu durumda

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

sağlar varsayalım satır 3 ve 4 maç normal ifade. 2,3,4'ün görünmesini ister misin? –

cevap

10

: Ben regex eşleşti çizgiyi ama hemen değil çizgiyi bundan önce alabilirsiniz awk:

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

'aw if' {if ($ 0 ~ /> /) head = $ 0; getline} {if ($ 0 ~/^ CGCGGCTGCTGG /) baskı kafası "\ n" $ 0} '.. bu doğru mu? – Sudeep

+0

@Sudeep: Test ederek doğru olup olmadığını kendinize söyleyebilirsin ... ama marco'nun önerisinden daha uzun ve anlaşılması zor, o zaman neden rahatsız oluyorsunuz? – Cascabel

+0

Teşekkürler Jeromi, evet, test edebilirim ... Öyle, ama getline biraz kafa karıştırıcıydı, bu yüzden birisinin komutayı gördüğü ve bayrağı yükseltebileceğini görmek için gönderildim :) – Sudeep

0

Neden kullanmak grep -EB1 '^CGCGGCTGCTGG'

awk aynı şeyi yapmak çok uzun süredir, Marco'nun cevabına bakın.

+0

Teşekkürler Marco ve Solmojo..grep de çalışır, sadece awk yapmak için gitti. – Sudeep

+0

Bir öğrenme alıştırması olarak yapılması iyi bir şeydir, ancak grep daha hızlı çalışacaktır ve biyometri üzerinde muhtemelen yararlı bir özelliktir. – ocodo

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

betiğiniz bunun için "bcd \ nabc \ nabcdef" –

+0

Düzeltilmiş gibi bir durumu düzgün bir şekilde ele almayacaktır. –

1

kullanımı daha kolay desen arama

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

0

Belki biraz konu dışı, ama ben arar yukarıdaki çözümün kendi varyasyon oluşturmak Belisarius'un cevabını kullanılan Nth giriş ve bunu ve önceki satırı döndürür.

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

Aşağıdaki awk komut dosyasını oluşturdum. Eşleşen çizgiyi ve önceki 2 satırı yazdırır. Bu fikirden daha esnek yapabilirsiniz.

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; 
      } 
     } 
    } 
} 

Kullanım:

awk '{print $0}' LogFile.log | awk -f search.awk