Kuyruk çıkışını filtrelemek mümkün mü?


11

Bir dosyayı kuyruğa almak istiyorum ama sadece belirli bir dize olan satırları çıktılamak istiyorum. Mümkün mü?

Yanıtlar:


32

grep kullanın. Sadece bu amaç için üretildi.

/ Var / log / syslog kuyruğunda "cron" bulunan kuyrukları bulmak için şunu çalıştırın:

tail -f /var/log/syslog | grep cron

Ve stdin üzerinden herhangi bir şeyi kabul ettiğinden, yukarıdaki komutla aynı şekilde (| sembolünü kullanarak) başka bir komutun çıkışında da kullanabilirsiniz.


8
Bu aslında doğru olmakla birlikte, grepetkileşimli olmayan bir şekilde kullanıldığında, örneğin daha uzun bir boru hattının parçası olduğu zaman tamponlanacağını fark etmek önemlidir . GNU grep 2.5.1 --line-buffered, boru hattındaki grep'i ortadan kaldırırken bir seçenek olmadığında bu sorunu çözme seçeneği sunar. (Ben grep olacak derken tampon Ben tampon 4k gibi bir şey ulaşmıştır kadar çıktıyı görmez demek.)
— KoJiRo

Önceki yorumu desteklemek için, modern Linux altındaki "tail -f", syslog dosyasında daha fazla girdi beklemek üzere bir döngüde çalışacaktır. Komutun dosyanın varolan içeriğiyle bitmesini sağlamak için -f anahtarını atlayın: tail / var / log / syslog | grep cron
— Gnudiff

7
tail -f /var/log/messages | grep "myfilterword"

Umarım yardımcı olur.


4

İşte bu kadar basit olmasa da, bazı ilginç ek esneklik sunabilecek başka birkaç fikir:

İlk olarak grep yerine awk ile filtre uygulayabilirsiniz:

tail -f /var/log/messages | awk '/myfilterword/'

kullanan örnekle tam olarak aynı şekilde çalışır grep. Awk gücünü kullanarak bunu genişletebilirsiniz, örneğin:

tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'

çıktının son alanı ile 6. arasındaki alanı yazdırır (alanlar boşlukla ayrılır)

Benzer bir fikir, perl tek astar kullanmaktır:

tail -f /var/log/messages | perl -ne "/myfilterword/ and print"

aynı şekilde çalışır grep. Belki bir satır numarası sayacı ve sadece 6. alan istersiniz? Buna ne dersin:

tail -f /var/log/messages | \ 
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"

Açıkçası, bu tür şeylerin hepsi başka araçlarla da yapılabilir, ancak burada awk veya perl gibi daha genel amaçlı dilleri kullanmanın eğlenceli yollarının olduğunu göstermek istedim.


Grep'ten daha fazla nasıl genişleyeceğine dair +1 büyük ayrıntı!
— pablo

2

Unutmaya değer başka bir hile, atlamak istediğiniz başlıklara sahip bir CSV dosyanız varsa, örneğin:

% cat data.txt
fruit        dessert        calories
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990
% tail -n +2 data.txt
Apple        Pie            770
Banana       Pudding        625
Cherry       Cobbler        990

Ne kadar uzun olabilir girdi fark etmez tailolduğunu +n -2ilk satırı ihmal edecek.

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.