bir günlük dosyası yerleştirin ancak yalnızca belirli satırları gösterin


29

-F bayrağı ile bir günlük dosyasını yazıyorum. O zaman bunu sadece "X" içeren satırları bulmak için grep'e yönlendiriyorum. Mükemmel çalışıyor. Şimdi bunu tekrar "P" içeren tüm çizgileri kaldıracak başka bir grepte borulamak istiyorum. İkinci boruyu eklediğimde dosya yenileniyor ve hiçbir veri gelmiyor gibi görünüyor.

Bu işe yarayan komuttur: tail -f my_file.log | grep "X"

Bu olmayan komuttur: tail -f my_file.log | grep "X" | grep -v "Y"

Bunu komutun çalışması için nasıl yapılandırmalıyım?


1
bir boruyu bir boruyla yapmaya çalışın, sırayı değiştirin, yapın tail -f file|grep -v "Y". Çıktı tamamsa eklemeye devam edin grep "X".
Aizuddin Zali

Yanıtlar:


38

Çıktısı greparabelleğe alındığında, satır arabelleğini etkinleştirmek için --line-bufferedseçeneğini kullanın grep:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

Eğer senin grepseçeneği yoktur, kullanabileceğiniz stdbufbir alternatif olarak:

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
Hangi ayarların kullanılacağını nasıl stdbufsöylediğini merak ediyorum libstdbuf.so.
kasperd

@ kasperd: Çevre değişkenleri.
Nate Eldredge

1
@NateEldredge Daha önce çıktıdaki ortam değişkenlerini aradım diff -u <(env) <(stdbuf env)ve hiçbiri bulamadım. Ama şimdi farkettim ki test etmem gereken şeydi diff -u <(env) <(stdbuf -oL env).
kasperd

Ben de aynı türden bir problemim. benim durumum, 'aaa' ve 'bbb' içeren tüm satırları yazdırmam gerekiyor. İlk çözümün üstünde çalışmıyor. İkinci çözüm 'aaa' varlığı için çalışıyor ve 'bbb' yok. ikisi de çalışmıyor. çıkış yok. komutum şöyle görünüyor: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' herhangi bir çıktı vermiyor. Lütfen bana yardım eder misiniz.
Sun

18

Normalde awkbu tür mantıksal kontroller için daha kullanışlı buluyorum :

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

Biri yazmaya devam ettiğim seq 20 >> myfilediğeri örneğin sahip olduğu iki sekme tarafından test edilmiştir tail -f myfile | awk '/3/ && !/13/'.


15

Başka bir yaklaşım grep, iki yerine tek bir çağrı kullanmak ve bu nedenle tamponlama sorununu önlemek olacaktır. Yalnızca 0 veya daha fazla Y olmayan karakter, ardından bir X ve ardından 0 veya daha fazla Y olmayan satırdan oluşan satırları sonuna kadar tekrarlayan normal ifadeler kullanın "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
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.