2012-11-23 9 views
27

grep ile Bağlamı sabit sayıda hatta nasıl ayarlayacağımı biliyorum. Bağlamdan sonra "bir sonraki boş satıra kadar" olarak ayarlanan keyfi bir dize koşuluna dayalı bir bağlam göstermek mümkün mü?Grep'i bağlamdan sonra "bir sonraki boş satıra kadar" olarak nasıl ayarlayabilirim?

Veya başka bir araç kombinasyonu mu? Temelde

Ben

+0

Bu, diğer araçlarla mümkündür. Bir örnek gönderirseniz, belirli yanıtları alırsınız. –

+0

Muhtemelen bunun için 'sed' veya 'awk' kullanmak istersiniz ... – dmckee

+0

Bunun tersini nasıl yapabilirim. Çağrı yığını ile bir günlük dosyası var. Bir çağrı yığını yazdırmak istemiyorum ama diğer tüm yığınları – Nikole

cevap

24

Bu gibi geliyor .... ben günlük dosyasında bir dize aramak, ama bütün olay göstermek istiyorum "olayları" ayıran boş satırlarla, bitişik hatların bir günlük dosyası var Eğer sed gerekir:

sed -n '/pattern/,/^$/p' file 

varsayılan ( -n) tarafından baskı yapmayın. /pattern/ ile eşleşen satırlar için /^$/ boş satırına kadar yazdırın. görsel olarak farklı eşleşen blok ayırmak için daha kolay yani

awk '/pattern/ {do_print=1} 
    do_print==1 {print} 
    NF==0 {do_print=0}' input_file 

Bu komut aynı zamanda boş satır yazdırılır: Burada

+0

Bunun olayın tamamını göstermediğini unutmayın, ancak olayın kalıbının önceki satırlarını özlüyor. –

+2

Clearify için: Komut, ', ' 'biçimindedir. “Pattern” eşleşmesi ile başlayan ve aşağıdaki boş satırın eşleşmesiyle sona eren ('^ $' ile eşleşen) kapsamlı adres aralıkları (satır aralıkları) bulur. Her bir aralık fonksiyonu için yürütülür ('p': gelen satırları yazdırır). Boş satırları çıktıdan çıkarmak için 'sed -n'/pattern /,/^ $/{/^$ /! P} 'file' kullanılır. Burada '/^$ /! P','^$ 'ile eşleşmeyen gelen satırları yazdırmak anlamına gelir. – valid

+1

Bu benim için mükemmel bir istisna ile çalıştı: kaynak girdimde DOS stili yeni satırlar (\ r \ n) vardı, bu yüzden bunu yerine yapmak zorundaydım: 'sed -n'/pattern /,/^ \ r $/p 'dosya' – bmaupin

7

okunabilmesi için çok sayıda satıra ayrılmış (test) awk çözeltisi, var.

  • awk: Eğer boş satır istemiyorsanız, 2 satır do_print==1 {print} ve NF==0 {do_print=0}

    Açıklama takas awk aracına başvurmak - bir zaman ardışık devam girdi bir satır değerlendirir.

  • '...'.: Tek tırnakların içerdiği her şey talimatlar olarak awk'a verilir. Bu durumda, her satıra verilen talimatları uygularız.
  • /pattern/ {do_print=1}: Bir çizgi "pattern" içerir zaman,
  • do_print==1 {print}do_print bayrağı
  • açmak: do_print bayrağı üzerinde ayarlanırsa, mevcut hattı yazdırmak.
  • NF==0 {do_print=0}: NF, Alan Sayısı anlamına gelir. awk, her satırı boşluklara ve sekmelere göre bir çizgiyi alanlara ayırmak için sınırlar. Bu durumda trivially boş bir satır yok alanları var - bu yüzden NF == 0
18

içeren bir satır gördüğümüzde baskı durdurmak için do_print bayrağını kapatmak basit bir çözümdür: için

awk '/pattern/' RS= input-file 

Ayar RS boş dize, awk'nin kayıt ayırıcı olarak boş satırları işlemesini sağlar ve /pattern/ basit kuralı, herhangi bir uzun süreli normal ifade olabilecek desenle eşleşen herhangi bir kaydı yazdırmak için awk neden olur.