Bir dosyayı kuyruğa almak istiyorum ama sadece belirli bir dize olan satırları çıktılamak istiyorum. Mümkün mü?
Bir dosyayı kuyruğa almak istiyorum ama sadece belirli bir dize olan satırları çıktılamak istiyorum. Mümkün mü?
Yanıtlar:
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.
İş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.
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 tail
olduğunu +n -2
ilk satırı ihmal edecek.
grep
etkileş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.)