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.