Apakah mungkin untuk melakukan tail -f
(atau serupa) pada file, dan grep
pada saat yang sama? Saya tidak akan keberatan perintah lain hanya mencari perilaku semacam itu.
Apakah mungkin untuk melakukan tail -f
(atau serupa) pada file, dan grep
pada saat yang sama? Saya tidak akan keberatan perintah lain hanya mencari perilaku semacam itu.
Jawaban:
Ini akan bekerja dengan baik; lebih umum, grep
akan 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
Tambahkan --line-buffered
ke grep
, dan itu dapat mengurangi penundaan untuk Anda. Sangat berguna dalam beberapa kasus.
tail -f foo | grep --line-buffered bar
grep
tidak 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.
Anda bisa menyalurkan output grep
ketail -f
. Ada juga program yang menggabungkan tail -f
fungsionalitas dengan penyaringan dan pewarnaan, khususnya multitail ( contoh ).
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.
tail -f access | awk '/ADD/{print $0}'
Gunakan di atas, saya biasanya menggunakannya.
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.
Berhasil. Tetapi berhati-hatilah bahwa output tidak lagi instan: ia mendapat buffer melalui pipa.
tail -f
di satu jendela, dan tail -f logfile | grep pattern
di jendela lainnya. Baris yang mengandung pattern
tidak selalu muncul di kedua jendela secara bersamaan. Saya telah melihat garis muncul 30 detik terpisah pada kesempatan langka, yang menjengkelkan.
tee
atau sesuatu.