tail -f path
Yukarıdakiler anında dosya üzerinde değişiklik yapacak, ancak çıktıya bir filtre uygulamak istiyorum, sadece xxx
iç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 xxx
iç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 -F
arkadaşın. Aradaki farkı aramana izin vereceğim.
Ama tail -f
ve tail -F
eklemek 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ü tail
açıkça satır tamponludur (veya her satırın sonunda çıktısını temizler) ve grep
ayrıca çıkış tamponunuza gidiyor çünkü satır tamponludur:
tail -F -n0 somefile | grep somepattern
Ama sonra böyle bir şey kullanmaya karar awk
veya cut
daha 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 grep
tamamen tamponlanmış bir şekilde çalışıyordur, ve böylece awk
bir seferde 4kB girişini alır (varsayılan olarak).
Bu durumda, seçeneği grep
kullanarak 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).
cut
Sizin beğenileriniz muhtemelen şanssız. ... ama aramayı deneyebilirsiniz unbuffer
, bu da sanırım expect
alet 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.