“Tail -f” dosyasının gerçek zamanlı çıktısına bir filtre nasıl uygulanır?


60
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?


1
Yanıtları kabul edildi olarak işaretlemek, benzer bir sorusu veya sorunu varsa, sorularınızı okuyan başkalarına ve hangi yanıtın daha fazla yardımcı olabileceğini bilmek için verilen cevaplara yardımcı olur. Kullanıcı adınızı tıklayarak önceki sorularınızı tekrar ziyaret edebilirsiniz.
Dennis Williamson,

Yanıtlar:


84

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

Ama diyelim ki kuyrukta 100 satır var (dosyanın sonunda) ve bu satırlar filtrelemek istediğiniz satırlardır. Sizin çözümünüz
TraderJoeChicago 7:11

1
Sadece bir dosyanın son 100 satırını aramak istiyorsanız tail -100 path | grep xxx
AddersUK

15

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


Bunun neden arabelleğe alma modunda çalıştığına ilişkin açıklamaları gerçekten takdir ediyorum . Bu mükemmel bir fikir, teşekkür ederim.
Yeşil,

2

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.

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.