tail -f path
Di atas akan menampilkan modifikasi ke file secara instan, tetapi saya ingin menerapkan filter ke output, hanya ditampilkan ketika ada kata kunci xxx
di dalamnya.
Bagaimana cara mendekati ini?
tail -f path
Di atas akan menampilkan modifikasi ke file secara instan, tetapi saya ingin menerapkan filter ke output, hanya ditampilkan ketika ada kata kunci xxx
di dalamnya.
Bagaimana cara mendekati ini?
Jawaban:
Dengan Unix Anda dapat menyalurkan output dari satu program ke program lainnya.
Jadi untuk menyaring ekor, Anda dapat menggunakan grep:
tail -f path | grep your-search-filter
Jawaban singkat: tail -f somefile | grep somepattern
Namun, ini cenderung gagal. Katakanlah Anda mengekor file yang sering diputar (jika ini adalah log debug, mungkin diputar beberapa kali). Dalam hal ini tail -F
adalah temanmu. Saya akan membiarkan Anda mencari perbedaannya.
Tetapi tail -f
dan tail -F
cetak banyak baris terlebih dahulu, yang sering kali tidak diinginkan dalam kasus penggunaan ini, jadi dalam kasus ini tambahkan-n0
tail -F -n0 somefile | grep somepattern
Itu akan baik-baik saja, sampai Anda ingin melakukan pemfilteran lain, dan kemudian Anda perlu waspada terhadap penyanggaan. stdout adalah buffer-line secara default saat menulis ke terminal tetapi ketika buffer-penuh saat menulis ke pipa. Jadi berikut ini akan memancarkan garis segera setelah mereka ditemukan, karena tail
secara garis-buffered (atau mem-flush output-nya di akhir setiap baris), dan grep
juga buffer-line karena outputnya pergi ke terminal Anda:
tail -F -n0 somefile | grep somepattern
Tetapi kemudian Anda memutuskan untuk menggunakan sesuatu seperti awk
atau cut
untuk lebih lanjut memproses output.
tail -F -n0 somefile | grep somepattern | awk '{print $3}'
Dan sekarang Anda bertanya-tanya di mana output Anda telah pergi ... tergantung pada volume log, Anda mungkin menemukan bahwa Anda memang mendapatkan output, tetapi itu akan menjadi halaman sekaligus karena sekarang stdout grep
beroperasi dengan mode buffered penuh, dan awk
menerima input 4kB sekaligus (secara default).
Dalam hal ini, Anda dapat mengatakan grep
untuk selalu membuat garis stdout di-buffer dengan menggunakan --line-buffered
opsi.
tail -F -n0 somefile | grep --line-buffered somepattern | ...
Namun, sebagian besar perintah tidak memiliki analog --line-buffered
. Dalam hal alat yang lebih skrip, Anda dapat menggunakan fungsi untuk menyiram output (mis. Dalam awk
, fungsinya adalah fflush()
, yang memiliki nama yang sama dengan rekan C-nya, alat seperti Perl dan Python memiliki sesuatu yang serupa).
Dengan orang-orang seperti cut
Anda kemungkinan kurang beruntung; ... tetapi Anda mungkin mencoba mencari unbuffer
, yang saya pikir sesuatu disediakan oleh expect
toolchain (saya tidak pernah menggunakannya).
Saya harap Anda menemukan ini berguna.
Cheers, Cameron
dan Anda dapat menggunakan banyak pipa dan greps, dan mengecualikan hal-hal dengan grep -v, dapatkan case sensitif dengan grep -i, dll.
yaitu: tail -100f / var / log / messages | grep -V ACPI | grep -i ata
mulai tailing 100 baris dari akhir, dan tetap tailing, pertama-tama mengecualikan setiap garis dengan ACPI, kemudian tunjukkan garis dengan ata, ATA, atau campuran dari mereka.
Satu lagi yang berguna adalah opsi ABC, untuk baris Setelah, Sebelum, dan Konteks (baris sebelum dan sesudah).