tail -f path
Yukarıdakiler anında dosya üzerinde değişiklik yapacak, ancak çıktıya bir filtre uygulamak istiyorum, sadece xxxiçinde bir anahtar kelime olduğunda göstereceğim .
Buna nasıl yaklaşılır?
tail -f path
Yukarıdakiler anında dosya üzerinde değişiklik yapacak, ancak çıktıya bir filtre uygulamak istiyorum, sadece xxxiçinde bir anahtar kelime olduğunda göstereceğim .
Buna nasıl yaklaşılır?
Yanıtlar:
Unix ile bir programın çıktısını diğerine aktarabilirsiniz.
Böylece kuyruğu filtrelemek için grep kullanabilirsiniz:
tail -f path | grep your-search-filter
Kısa cevap: tail -f somefile | grep somepattern
Ancak, bu kısa düşme eğilimindedir. Sık sık dönen bir dosyaya dokunduğunuzu varsayalım (eğer bir hata ayıklama günlüğü ise, birkaç kez döndürülebilir). Bu durumda tail -Farkadaşın. Aradaki farkı aramana izin vereceğim.
Ama tail -fve tail -Feklemek Dolayısıyla bu durumda, bu kullanım örneği genellikle istenmeyen bir ilk çizgilerinden oluşan bir demet, çıktısını-n0
tail -F -n0 somefile | grep somepattern
Başka bir filtreleme yapmak isteyinceye kadar bu iyi olacaktır ve ardından tamponlamaya dikkat etmeniz gerekir. stdout, bir terminale yazarken varsayılan olarak satır arabelleğe alınır, ancak bir boruya yazarken tamamen arabelleğe alınır. Bu nedenle, aşağıdaki satırlar bulur bulunmaz satırları yayarlar, çünkü tailaçıkça satır tamponludur (veya her satırın sonunda çıktısını temizler) ve grepayrıca çıkış tamponunuza gidiyor çünkü satır tamponludur:
tail -F -n0 somefile | grep somepattern
Ama sonra böyle bir şey kullanmaya karar awkveya cutdaha fazla çıkış işlemek için.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
Ve şimdi çıktınızın nereye gittiğini merak ediyorsunuz ... logların hacmine bağlı olarak, çıktı aldığınızı görebilirsiniz, ancak bir seferde bir sayfa olacaktır çünkü şu anda stdout greptamamen tamponlanmış bir şekilde çalışıyordur, ve böylece awkbir seferde 4kB girişini alır (varsayılan olarak).
Bu durumda, seçeneği grepkullanarak her zaman stdout satırını arabelleğe almasını söyleyebilirsiniz --line-buffered.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Ancak, çoğu komutun analogu yoktur --line-buffered. Daha fazla komut dosyası yazılabilen araçlar söz konusu olduğunda, çıktının yıkanması için bir işlev kullanabilirsiniz (örn. awkİşlev, fflush()C karşılığıyla aynı adı paylaşan, Perl ve Python gibi araçlar benzer bir şeye sahiptir).
cutSizin beğenileriniz muhtemelen şanssız. ... ama aramayı deneyebilirsiniz unbuffer, bu da sanırım expectalet zincirinin sağladığı bir şey (daha önce hiç kullanmadım).
Umarım bunu faydalı bulmuşsunuzdur.
Şerefe, Cameron
ve birden çok boru ve grep kullanabilir ve grep -v ile şeyleri hariç tutabilirsiniz, grep -i ile büyük küçük harf duyarlılığı elde edebilirsiniz.
örneğin: tail -100f / var / log / messages | grep -V ACPI | grep -i ata
Sonundan itibaren 100 çizgi izlemeye başlayın ve izlemeye devam edin, önce ACPI içeren çizgileri hariç tutun, sonra ata, ATA işaretli çizgileri veya bunların karışımlarını gösterin.
Bir başka kullanışlı olan da, Sonra, Önce ve Bağlam (satırlardan önce ve sonra satırlar) satırları için ABC seçenekleridir.