Di ekor -f, bagaimana cara menyaring hal-hal yang memiliki kata kunci tertentu?

Jawaban:

58

Saya tidak tahu tentang menggunakan awk alih-alih grep, tetapi ini berhasil bagi saya:

tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'

EDIT: Seperti yang ditunjukkan oleh dmourati dan Caleb , Anda juga bisa menggunakan egrepbukan grep -Euntuk kenyamanan. Pada beberapa sistem, ini akan berupa tautan ke biner yang sama, pada yang lain salinannya dipasok oleh paket grep. Apa pun itu hidup sebagai alternatif untuk -Eberalih. Namun, menurut halaman manual grep GNU:

[…] Dua program varian egrepdan fgreptersedia. egrepsama dengan grep -E. fgrepsama dengan grep -F. Doa langsung sebagai salah satu egrepatau fgrepsudah usang, tetapi disediakan untuk memungkinkan aplikasi historis yang bergantung pada mereka untuk berjalan tanpa dimodifikasi.

Karena itu adalah perintah yang identik, itu turun ke preferensi kecuali Anda tidak memiliki egrep sama sekali. Namun untuk kompatibilitas kedepan, disarankan untuk menggunakan grep -Esintaks karena metode lain secara resmi tidak digunakan lagi.

DTest
sumber
Apakah menggunakan grep -Ealih-alih egrepmenjamin jawaban duplikat?
Caleb
@ Caleb Saya tidak melihat mengapa tidak. Ada lebih dari satu cara untuk menguliti kucing, dan situs ini memungkinkan Anda mendaftar semua
DTest
1
Ya, tetapi mereka hanya saling terkait satu sama lain, bukan dua program yang berbeda dengan beberapa tumpang tindih fungsional. Jadi bukankah itu lebih dari 'tambahan' (baca: komentar), bukan jawaban lengkap? Saya mengalami downvotes untuk pelanggaran yang lebih ringan ...
Marcin
@Dest: Secara hak cipta dmourati benar-benar mengalahkan saya dalam beberapa detik dan meskipun dia tidak menjelaskan alasannya, dia pantas mendapatkan pujian di sini. Anda jelas terlambat ke pesta karena kami berdua memiliki setidaknya dua upvotes sebelum Anda masuk. Mengubah sintaksis dari biner yang disinkronkan ke argumen biasanya adalah sesuatu yang Anda akan gunakan komentar untuk, bukan jawaban yang terpisah. Jika Anda ingin kulit kucing berbeda menggunakan sed, awk, perl, multitailatau ninja_foo.
Caleb
1
@Dest: Saya mengambil kebebasan membuat edit faktual yang signifikan untuk jawaban Anda untuk menambahkan beberapa sumber asli. Sepertinya -E direkomendasikan untuk penggunaan di masa mendatang, jadi saya menandai itu, tetapi menghapus catatan Anda tentang distro yang tidak memiliki egrep. Distro-distro lain yang disebutkan memiliki egrep, itu hanya sebuah biner terpisah dan bukan sebuah symlink.
Caleb
21

Cobalah memipakannya ke egrep dengan daftar kata-kata yang ingin Anda saring:

tail -f log_file | egrep -v 'ELB|Pingdom|Health'

Perhatikan bahwa menggunakan tanda kurung di sekitar daftar kecocokan adalah opsional. Karena |diperlakukan sebagai operator ATAU logis dengan grep apakah itu terjadi sebagai bagian dari sub-grup atau tidak. '(ELB|Pingdom|Health)'akan berfungsi persis sama. Untuk beberapa orang, sintaksis mungkin lebih jelas; Saya merasa lebih mudah untuk mengetik tanpa karena saya dapat beralih dari satu pertandingan ke daftar kemungkinan pertandingan tanpa kembali menambahkan tanda kurung.

Untuk kredit tambahan, perlu disebutkan bahwa multitailninja foo melakukan penyaringan output. Misalnya, Anda dapat memfilter untuk kata-kata Anda seperti ini:

multitail -e ELB -e Pingdom -e Health -f log_file

Anda juga dapat menggunakannya untuk mewarnai atau menyorot output alih-alih hanya memfilternya.

Sunting : Lihat jawaban DTests dan komentar untuk penjelasan lengkap tentang bagaimana egrep hanyalah cara alternatif yang tidak digunakan untuk memecat grep -E.

Caleb
sumber
2
ekspresi tidak boleh diakhiri dengan ('), bukan dengan (")?
bbaja42
Ya terima kasih itu salah ketik. Untuk referensi di masa depan karena situs pertukaran stack berfungsi seperti wiki, itu adalah hal yang bisa Anda perbaiki.
Caleb
Saya pikir hasil edit harus lebih dari 6 karakter?
Sirex
Jika Anda tidak memiliki perwakilan tinggi, ya ada minimum 6 karakter, tetapi dalam hal ini 1 karakter sangat penting. Anda dapat memaksakan perubahan melalui dengan menambahkan komentar HTML ke badan. Karakter akan dihitung hingga batas dan Anda dapat mencatat mengapa Anda membuat perubahan.
Caleb
@ Caleb terima kasih banyak atas saran multitailnya luar biasa !! Aku tidak percaya aku pergi begitu lama dalam hidupku tanpanya.
sidewinderguy
5
tail -f /path/to/log | egrep -v 'ELB|Pingdom|Health'
dmourati
sumber
3

Mengapa Anda ingin mencatat informasi ini?

  • Apakah ini hanya untuk arsip?
  • Apakah Anda ingin menjalankan skrip yang berbeda tergantung pada kata kunci atau pola yang berbeda dalam file log?

Jika Anda ingin memiliki perilaku skrip tergantung pada konten file log, Anda mungkin ingin melakukan pemfilteran menggunakan Expect. ( http://en.wikipedia.org/wiki/Expect ) Harapkan adalah ekstensi Tcl tetapi Ada juga versi Python dari Harapkan.

Harapkan memberi Anda ini beralih fleksibel seperti pernyataan yang memungkinkan Anda menentukan perilaku yang berbeda tergantung kondisi, atau pola yang ada dalam aliran input Anda. Sebagai contoh:

expect {  
    "password:" {  
        send "password\r"  
    } 
    "yes/no)?" {  
        send "yes\r"  
        set timeout -1  
    }  
    timeout {  
        exit  
    }   
    -re . {  
        exp_continue  
    }  
    eof {  
        exit  
    }  
}

Jadi Anda menentukan pola dalam pernyataan harapan, dan Anda menentukan perilaku yang berbeda, dan Anda bisa membungkus semuanya dalam satu lingkaran, dan Anda dapat dengan mudah menulis filter yang sangat kuat yang juga menulis bagian dari input Anda ke file yang berbeda, atau menjatuhkannya sama sekali, atau mengambil tindakan dan menjalankan skrip lain tergantung pada apa yang ada di input Anda

Jadi, turun ke mengapa Anda mencoba untuk memfilter file log Anda, untuk mengambil tindakan pada input log, atau hanya untuk alasan arsip?

Jerry Asher
sumber
Plus satu untuk referensi untuk Harapkan, yang saya gunakan cukup lama dan benar-benar lupa.
MPi