Tentu saja saya tahu itu
cat logfile.txt | wc -l
120
akan memberi tahu saya jumlah baris dalam file.
Sedangkan
tail -f logfile.txt
akan menunjukkan kepada saya baris baru yang ditulis oleh program lain logfile.txt
.
Apakah mungkin untuk menggabungkan keduanya sehingga saya mendapatkan jumlah baris yang diperbarui terus-menerus dari logfile.txt dengan utilitas teks standar?
Saya tahu tentang
watch wc -l logfile.txt
tapi saya tidak ingin menghitung ulang seluruh file setiap kali, yang sepertinya sia-sia. Orang akan membutuhkan hitungan hanya ditambahkan setiap detik atau lebih dan mungkin \r
bukan sebagai \n
pada akhir baris.
cat
keluaran perpipaan kewc
juga merupakan pemborosan besar !!Jawaban:
Mungkin:
Hati-hati karena akan menghasilkan angka untuk setiap jalur input (meskipun mengabaikan nilai sebelumnya jika dikirim ke terminal).
Atau Anda dapat menerapkan
tail -f
dengan tangan di shell:(perhatikan bahwa ia menjalankan hingga satu
wc
dan satusleep
perintah per detik yang tidak semua shell memiliki built-in. Denganksh93
sementarasleep
builtin, untuk mendapatkan built inwc
(setidaknya pada Debian), Anda perlu menambahkan/opt/ast/bin
di bagian depan$PATH
(terlepas dari apakah direktori itu ada atau tidak) atau gunakancommand /opt/ast/bin/wc
(jangan tanya ...)).Anda dapat menggunakan
pv
, seperti pada:Namun berhati-hatilah bahwa itu menambahkan
k
,M
... sufiks ketika jumlahnya lebih dari 1000 (dan sepertinya tidak ada cara lain ).sumber
tail | awk
solusi Anda . Ketahui opsi Anda:-n +0
tidak akan terpikir oleh saya dalam kombinasi ini.pv
- Alat baru lain yang bermanfaat. terima kasih banyak.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
awk
adalah superset darigrep
.tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
END{print ""}
untuk membuatawk
cetak baris baru di akhir.Coba hitung dengan murni
bash
tanpawc
:atau bahkan seperti ini untuk menulis ulang nilai sebelumnya:
sumber
Saya tidak percaya ada yang seperti itu. Tetapi semestinya mudah untuk menyiapkan sesuatu seperti:
(Gagasan umum dari
perlfunc(1)
)sumber
printf foo >> file
. Anda harus menghitung karakter baris baru (seperti yangwc -l
dilakukan dalam solusi shell yang saya sarankan), bukan catatan yang dikembalikan oleh<$fh>
. Saya tidak berpikir Anda perlu menggunakantell
atauseek
sama sekali.<$fh>
membaca garis secara default, tidak mencatat. Halaman manual Perl yang dikutip memberi tahu untuk melakukannya dengan cara ini demi lingkungan yang mungkin tidak kooperatif (bisa bergantung pada sistem file, saya kira NFS atau sistem file yang dipasang di jaringan lainnya mungkin memerlukan sedikit dorongan).<$fh>
akan mengembalikan catatan meskipun tidak diakhiri oleh karakter baris baru. Jadi jikaperl
duduk di akhir file, dan seseorang kemudian melakukanprintf foo >> file
, maka<$fh>
akan kembalifoo
(bukan baris karena tidak dihentikan oleh karakter baris baru), dan$count
akan bertambah meskipun tidak ada garis tambahan yang ditambahkan ke file.Melanjutkan solusi berbasis awk: Anda mungkin tidak perlu melihat penghitung berdetik untuk setiap baris dalam log Anda; itu masalahnya, Anda dapat memilikinya seperti ini (nomor akan berubah untuk setiap 10 baris):
sumber