Tail -f'de, belirli anahtar kelimeleri olan öğeleri nasıl filtreleyebilirim?


Yanıtlar:


58

Grep yerine awk kullanma hakkında hiçbir fikrim yok, ancak bu benim için çalışıyor:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

DÜZENLEME: As dmourati ve Caleb işaret, ayrıca kullanabilirsiniz egrepyerine grep -Ekolaylık. Bazı sistemlerde bu, aynı ikiliye bir bağlantı olacak, bazılarında da grep paketi tarafından sağlanan bir kopyası olacaktır. Her iki şekilde de, -Eanahtara alternatif olarak yaşar . Ancak, GNU grep man sayfasına göre:

[…] İki değişken program egrepve fgrepmevcuttur. egrepaynıdır grep -E. fgrepaynıdır grep -F. Her iki şekilde de doğrudan çağrı yapılması egrepveya fgrepkullanımdan kaldırılması, ancak bunlara dayanan tarihsel uygulamaların değiştirilmemiş olarak çalıştırılmasına izin vermek için sağlanmıştır.

Bunlar eşanlamlı komutlar olduğundan, hiç egrep olmadıkça tercihe bağlı kalır. Ancak ileriye dönük uyumluluk için, grep -Ediğer yöntemin resmi olarak kullanımdan kaldırılması nedeniyle sözdiziminin kullanılması önerilir .


Yerine grep -Eyerine egrepyinelenen bir cevap emri mi kullanıyor ?
Caleb,

@Caleb Neden olmadığını anlamıyorum. Bir kedinin derisini
yüzmenin

1
Evet, fakat bunlar sadece birbirleriyle sembolizedir, işlevsel örtüşmeleri olan iki farklı program değildir. Öyleyse bu tam bir cevap olarak değil, bir 'zeyilname' (okuma: yorum) daha fazla olmaz mıydı? Daha az suçtan aşağı oy aldım ...
Marcin

@ Test: dmourati haklar gereği beni birkaç saniye yumrukla dövdü ve buradaki kredisini hakettiği gerekçesini açıklamamasına rağmen. Partiye açıkça geç kaldınız, çünkü siz ikiniz gelmeden önce en az iki oyumuz vardı. Sözdizimi sembolik bir ikili dosyadan bir argümana değiştirmek genellikle yorum yapmak için kullanacağınız bir şeydir, ayrı bir cevap değil. Eğer farklı cilde kedi ister kullanırsanız sed, awk, perl, multitailveya ninja_foo.
Caleb

1
@DTest: Bazı orijinal kaynakları eklemek için cevabınızı anlamlı bir şekilde düzenleme özgürlüğüne kavuştum. Gelecekte kullanım için -E tavsiye edilmiş gibi görünüyor, bu yüzden işaretledim, ancak egrep olmayan dağıtımlarla ilgili notunuzu kaldırın. Bahsedilen dağıtımların egrep'i var, bu bir sembolik link yerine sadece ayrı bir ikili dosya.
Caleb,

21

Filtrelemek istediğiniz kelimelerin ayrılmış bir listeleriyle egrep'e aktarmayı deneyin:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Eşleşme listesi çevresinde parantez kullanmanın isteğe bağlı olduğunu unutmayın. Çünkü |mantıksal bir OR operatörü olarak kabul edilir, çünkü bir alt grubun parçası olup olmadığına bakın. '(ELB|Pingdom|Health)'tam olarak aynı işlevi görür. Bazıları için, sözdizimi daha açık olabilir; Parantez eklemek için geri dönmeden tek bir eşleşmeden olası eşleşmeler listesine geçebildiğim için yazmadan daha kolay yazıyorum.

Ekstra kredi için, multitailfiltreleme çıktısı söz konusu olduğunda ninja foo yaptığını belirtmeye değer . Örneğin, şu kelimelerinizi filtreleyebilirsiniz:

multitail -e ELB -e Pingdom -e Health -f log_file

Çıktıyı yalnızca filtrelemek yerine renklendirmek veya başka bir yolu vurgulamak için de kullanabilirsiniz.

EDIT: Bkz. DTest cevapları ve egrep'in nasıl ateş etmenin alternatif bir yolu olduğu konusunda tam bir açıklama için yapılan yorumlar grep -E.


2
İfade (') ile bitmeli, (") ile
bitmeli

Evet, bu bir yazım hatası oldu. Yığın değişim siteleri wikiler gibi işlediğinden dolayı gelecek referanslar için, düzeltebileceğiniz türden bir şey bu.
Caleb,

Düzenlemenin 6 karakterden fazla olması gerektiğini düşündüm?
Sirex

Temsilciniz yüksek değilse, evet minimum 6 karakter vardır, ancak bu durumda 1 karakter çok önemlidir. Gövdeye bir HTML yorumu ekleyerek değişikliği zorlayabilirsiniz. Karakterler sınıra göre sayılır ve değişikliği neden yaptığınızı not edebilirsiniz.
Caleb,

@Caleb multitail öneri için çok teşekkürler harika ! Hayatım boyunca o kadar uzun sürdüğüme inanamıyorum.
sidewinderguy


3

Bu bilgiyi neden kaydetmek istiyorsun?

  • Kesinlikle arşivleme için mi?
  • Günlük dosyalarındaki farklı anahtar kelimelere veya kalıplara bağlı olarak koşullu olarak farklı komut dosyaları çalıştırmak ister misiniz?

Günlük dosyalarının içeriğine bağlı olarak komut dosyası içeren bir davranış yapmak istiyorsanız, filtreleme işleminizi Expect kullanarak yapmak isteyebilirsiniz. ( http://en.wikipedia.org/wiki/Expect ) Beklenti bir Tcl eklentisidir ancak Beklentinin bir Python sürümü de vardır.

Expect, durumlara veya giriş akışınızda bulunan desenlere bağlı olarak koşullu olarak farklı davranışlar belirlemenizi sağlayan bu güçlü esnek anahtar benzeri ifadeyi verir. Örneğin:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Böylece bekletme ifadesinde kalıplar belirlersiniz ve farklı davranışlar belirlersiniz ve her şeyi bir döngüye sarabilir ve girişinizin bölümlerini farklı dosyalara yazan çok güçlü filtreleri kolayca yazabilir veya tamamen bırakabilirsiniz. veya giriş yapın ve içeriğinize bağlı olarak diğer komut dosyalarını çalıştırın.

Öyleyse, neden günlük dosyalarınızı filtrelemeye, günlük girişinde işlem yapmak için mi yoksa sadece arşivleme nedenleriyle mi çalışıyorsunuz?


Artı, uzun zaman önce kullandığım ve tamamen unutmuş olduğum Expect'in referansı.
MPI
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.