tail -fGünlüklerimi istiyorum . Ancak, kelimeleri olan her şeyi filtrelemek istiyorum:
"ELB", "Pingdom", "Sağlık"
tail -fGü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 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
egrepvefgrepmevcuttur.egrepaynıdırgrep -E.fgrepaynıdırgrep -F. Her iki şekilde de doğrudan çağrı yapılmasıegrepveyafgrepkullanı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 .
grep -Eyerine egrepyinelenen bir cevap emri mi kullanıyor ?
sed, awk, perl, multitailveya 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, 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.
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?