GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menerapkan filter ke output waktu nyata dari `tail -f`?

Solusi 1:

Dengan Unix Anda dapat menyalurkan keluaran dari satu program ke program lainnya.

Jadi untuk memfilter tail, Anda bisa menggunakan grep:

tail -f path | grep your-search-filter

Solusi 2:

Jawaban singkat:tail -f somefile | grep somepattern

Namun, ini cenderung gagal. Katakanlah Anda mengikuti file yang sering diputar (jika ini adalah log debug, mungkin diputar beberapa kali). Dalam hal ini tail -F adalah temanmu. Saya akan membiarkan Anda melihat perbedaannya.

Tapi tail -f dan tail -F cetak banyak baris terlebih dahulu, yang seringkali tidak diinginkan dalam kasus penggunaan ini, jadi dalam hal ini tambahkan -n0

tail -F -n0 somefile | grep somepattern

Itu akan baik-baik saja, sampai Anda ingin melakukan pemfilteran lain, dan kemudian Anda perlu berhati-hati terhadap buffering. stdout di-buffer baris secara default ketika menulis ke terminal tetapi saat buffer penuh saat menulis ke pipa. Jadi berikut ini akan mengeluarkan baris segera setelah ditemukan, karena tail secara eksplisit di-buffer baris (atau mengeluarkan outputnya di akhir setiap baris), dan grep juga di-buffer baris karena keluarannya menuju ke terminal Anda:

tail -F -n0 somefile | grep somepattern

Tapi kemudian Anda memutuskan untuk menggunakan sesuatu seperti awk atau cut untuk memproses keluaran lebih lanjut.

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

Dan sekarang Anda bertanya-tanya ke mana output Anda pergi ... tergantung pada volume log, Anda mungkin menemukan bahwa Anda memang mendapatkan output, tetapi itu akan menjadi halaman sekaligus karena sekarang stdout dari grep beroperasi dengan mode buffer penuh, jadi awk menerimanya memasukkan 4kB sekaligus (secara default).

Dalam hal ini, Anda dapat memberi tahu grep untuk selalu membuat baris stdout disangga 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 membersihkan keluaran (mis. Dalam awk , fungsinya adalah fflush() , yang memiliki nama yang sama dengan mitra C-nya, alat seperti Perl dan Python memiliki sesuatu yang serupa).

Dengan suka cut Anda mungkin kurang beruntung; ... tetapi Anda dapat mencoba mencari unbuffer , yang menurut saya disediakan oleh expect toolchain (saya belum pernah menggunakannya).

Saya harap ini berguna bagi Anda.

Salam, Cameron

Solusi 3:

dan Anda dapat menggunakan banyak pipa dan grep, dan mengecualikan hal-hal dengan grep -v, mendapatkan ketidakpekaan huruf besar-kecil dengan grep -i, dll.

yaitu:tail -100f /var/log/messages | grep -V ACPI | grep -i ata

mulai membuntuti 100 baris dari akhir, dan terus membuntuti, pertama kecualikan baris apa pun dengan ACPI, lalu tampilkan baris dengan ata, ATA, atau campuran apa pun dari itu.

Fitur praktis lainnya adalah opsi ABC, untuk baris Setelah, Sebelum, dan Konteks (baris sebelum dan sesudah).


Linux
  1. Bagaimana cara menangkap output dari perintah teratas dalam file di linux?

  2. Bagaimana cara menyalurkan output dari grep ke cp?

  3. Cara meneruskan output perintah sebagai beberapa argumen ke perintah lain

  1. Bagaimana Menyoroti Kata Dalam Output "kucing"??

  2. Bagaimana saya bisa memfilter hasil unik dari keluaran grep?

  3. Cara grep keluaran ps dengan header

  1. Output Ke Stdout Dan Pada Saat Yang Sama Grep Ke File?

  2. Cara memahami keluaran warna

  3. Bagaimana cara saya grep secara rekursif?