Saya ingin mengekor file tetapi hanya baris output yang memiliki string tertentu di dalamnya. Apakah ini mungkin?
Saya ingin mengekor file tetapi hanya baris output yang memiliki string tertentu di dalamnya. Apakah ini mungkin?
Jawaban:
gunakan grep. Itu dibangun hanya untuk tujuan itu.
Untuk menemukan baris dari ekor / var / log / syslog yang memiliki "cron" di dalamnya, jalankan:
tail -f /var/log/syslog | grep cron
Dan karena ia menerima apa pun melalui stdin, Anda dapat menggunakannya pada output dari perintah lain apa pun, dengan memipis dengan cara yang sama seperti di atas (menggunakan simbol |).
Berikut adalah beberapa ide lain, yang walaupun tidak sesederhana itu, dapat menawarkan beberapa fleksibilitas tambahan yang menarik:
Pertama, Anda dapat memfilter dengan awk alih-alih grep:
tail -f /var/log/messages | awk '/myfilterword/'
yang bekerja persis sama dengan contoh menggunakan grep
. Anda dapat memperluas ini dengan menggunakan kekuatan awk, misalnya:
tail -f /var/log/messages | \
awk '/myfilterword/ { for (i=6; i<=NF; i++) printf("%s ", $i); printf("\n")}'
yang akan mencetak tanggal 6 melalui kolom terakhir dari keluaran (bidang dipisahkan spasi)
Gagasan lain yang serupa adalah menggunakan perl one-liner:
tail -f /var/log/messages | perl -ne "/myfilterword/ and print"
itu bekerja persis seperti grep
. Mungkin Anda ingin penghitung nomor baris dan hanya bidang ke-6? Bagaimana dengan ini:
tail -f /var/log/messages | \
perl -lane "/myfilterword/ and printf \"%6d %s\n\",++\$a,\$F[6]"
Tentunya semua hal ini dapat dilakukan dengan alat lain juga, tetapi saya ingin menggambarkan bahwa ada beberapa cara yang menyenangkan untuk menggunakan bahasa tujuan yang lebih umum seperti awk atau perl di sini.
Trik lain yang perlu diperhatikan, jika Anda memiliki file CSV dengan header yang ingin Anda hilangkan, mis:
% 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
Tidak peduli berapa lama inputnya tail
, +n -2
akan menghilangkan baris pertama.
grep
buffer akan digunakan ketika digunakan secara non-interaktif, seperti ketika itu merupakan bagian dari pipa yang lebih panjang. GNU grep 2.5.1 menawarkan--line-buffered
opsi untuk mengatasi ini ketika menghilangkan grep dari pipa bukanlah suatu pilihan. (Ketika saya mengatakan grep akan buffer saya maksudkan Anda tidak akan melihat output sampai buffer mencapai sesuatu seperti 4k.)