grep dan tail -f?

28

Apakah mungkin untuk melakukan tail -f(atau serupa) pada file, dan greppada saat yang sama? Saya tidak akan keberatan perintah lain hanya mencari perilaku semacam itu.

xenoterracide
sumber

Jawaban:

46

Menggunakan GNU taildan GNU grep, saya dapat tail -fmemahami menggunakan sintaks langsung:

tail -f /var/log/file.log | grep search_term
Steven D
sumber
Ini adalah solusi yang bekerja dengan implementasi lain dari kedua utilitas ini, bukan hanya implementasi GNU.
Kusalananda
7

Ini akan bekerja dengan baik; lebih umum, grepakan menunggu ketika suatu program tidak menghasilkan, dan terus membaca saat keluaran masuk, jadi jika Anda melakukannya:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

Tidak ada yang akan terjadi selama 5 detik, kemudian grep akan menampilkan "test" yang cocok, dan kemudian lima detik kemudian akan keluar ketika proses pipa tidak

Michael Mrozek
sumber
7

Tambahkan --line-bufferedke grep, dan itu dapat mengurangi penundaan untuk Anda. Sangat berguna dalam beberapa kasus.

tail -f foo | grep --line-buffered bar
Angka
sumber
2
Itu berguna ketika output dari greptidak pergi ke terminal (dialihkan ke jenis file lain). line buffering adalah default ketika output masuk ke terminal, sehingga tidak ada bedanya di sana. Perhatikan bahwa opsi itu spesifik untuk GNU.
Stéphane Chazelas
3

Anda bisa menyalurkan output grepketail -f . Ada juga program yang menggabungkan tail -ffungsionalitas dengan penyaringan dan pewarnaan, khususnya multitail ( contoh ).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saya melihat semua orang ini mengatakan untuk menggunakan tail -f, tetapi saya tidak suka batasan itu! Metode favorit saya mencari file sambil juga mencari baris baru (misalnya, saya biasanya bekerja dengan file log yang ditambahkan output diarahkan proses dieksekusi secara berkala melalui pekerjaan cron) adalah:

 tail -Fn+0 /path/to/file|grep searchterm

Ini mengasumsikan GNU tail and grep. Rincian pendukung dari halaman belakang (GNU coreutils, mine is v8.22) [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

Jadi, bagian ekor dari perintah saya sama dengan tail --follow --retry --lines=+0, di mana argumen terakhir mengarahkannya untuk memulai di awal, melewatkan nol garis.

wajiii
sumber
1
tail -f access | awk '/ADD/{print $0}'

Gunakan di atas, saya biasanya menggunakannya.


sumber
0

Anda dapat menggunakan netcat untuk menangkap hasil tail -f karena hasil baru masuk dengan mudah.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

Ini mengatur grep untuk mendengarkan hasil input yang berasal dari port 1337.
Perintah kedua mem -pipe output dari tail -f ke netcat dan mengirimkannya ke localhost 1337. Untuk melakukannya secara lokal, Anda perlu mengganti ttys untuk masing-masing dari dua set perintah. , atau gunakan sesuatu seperti layar.

Justin S
sumber
0

Berhasil. Tetapi berhati-hatilah bahwa output tidak lagi instan: ia mendapat buffer melalui pipa.

mouviciel
sumber
Sepakat. Untuk mengujinya, buka dua jendela. Jalankan tail -fdi satu jendela, dan tail -f logfile | grep patterndi jendela lainnya. Baris yang mengandung patterntidak selalu muncul di kedua jendela secara bersamaan. Saya telah melihat garis muncul 30 detik terpisah pada kesempatan langka, yang menjengkelkan.
Stefan Lasiewski
Itu mungkin lebih berkaitan dengan sistem membalik antara menjalankan satu atau lain contoh ekor. Tes yang lebih baik akan kita teeatau sesuatu.
Kevin Cantu