Apakah mungkin untuk menyaring keluaran ekor?

11

Saya ingin mengekor file tetapi hanya baris output yang memiliki string tertentu di dalamnya. Apakah ini mungkin?

Abe Miessler
sumber

Jawaban:

32

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 |).

Ryan H
sumber
8
Meskipun ini pada dasarnya benar, penting untuk menyadari bahwa grepbuffer akan digunakan ketika digunakan secara non-interaktif, seperti ketika itu merupakan bagian dari pipa yang lebih panjang. GNU grep 2.5.1 menawarkan --line-bufferedopsi 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.)
kojiro
Untuk melengkapi komentar sebelumnya, "tail -f" di Linux modern akan bekerja dalam satu lingkaran, menunggu lebih banyak input dalam file syslog. Agar perintah benar-benar selesai dengan isi file yang ada, hapus -f switch: tail / var / log / syslog | grep cron
Gnudiff
7
tail -f /var/log/messages | grep "myfilterword"

Semoga itu bisa membantu.

pablo
sumber
4

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.

Phil Hollenback
sumber
+1 elaborasi hebat tentang cara memperluas lebih jauh daripada grep!
pablo
2

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 -2akan menghilangkan baris pertama.

JeffG
sumber