tail -f
Günlüklerimi istiyorum . Ancak, kelimeleri olan her şeyi filtrelemek istiyorum:
"ELB", "Pingdom", "Sağlık"
tail -f
Günlüklerimi istiyorum . Ancak, kelimeleri olan her şeyi filtrelemek istiyorum:
"ELB", "Pingdom", "Sağlık"
Yanıtlar:
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 egrep
yerine grep -E
kolaylı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, -E
anahtara alternatif olarak yaşar . Ancak, GNU grep man sayfasına göre:
[…] İki değişken program
egrep
vefgrep
mevcuttur.egrep
aynıdırgrep -E
.fgrep
aynıdırgrep -F
. Her iki şekilde de doğrudan çağrı yapılmasıegrep
veyafgrep
kullanı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 -E
diğer yöntemin resmi olarak kullanımdan kaldırılması nedeniyle sözdiziminin kullanılması önerilir .
grep -E
yerine egrep
yinelenen bir cevap emri mi kullanıyor ?
sed
, awk
, perl
, multitail
veya ninja_foo
.
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, multitail
filtreleme çı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
.
Bu bilgiyi neden kaydetmek istiyorsun?
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?