Apakah ada perintah Unix / Linux untuk menghitung baris per detik dari stdin?


22

Saya mencoba untuk menghitung jumlah query SQL per detik dari file log dan saya ingin melakukannya secara real time dengan mem-pipe stdout dari grep ke beberapa perintah. (Saya melakukan beberapa pengujian kinerja)

Saya bisa menulis sendiri, tetapi berpikir pasti ini akan ada.

Saya melihat wc tetapi tidak melihat opsi untuk mengizinkan ini.

Saya juga bisa menggunakannya untuk menghitung permintaan per detik dengan mem-pipe ekor dari log akses.



Saya mencari sesuatu yang secara umum lebih berguna yang mengacu pada pertanyaan itu.
digidigo

Jawaban:


2
watch -n 3 "wc -l logfile"

halaman manual

tonton - jalankan program secara berkala, tampilkan keluaran layar penuh Secara default, program dijalankan setiap 2 detik; gunakan -n atau --interval untuk menentukan interval yang berbeda.


45

pvadalah perintahmu! P ipe V iewer mencetak statistik tentang data yang melewatinya, dan dapat berjalan di mana saja dalam pipa Anda, karena itu pipa stdin langsung ke stdout. Sebagai contoh:

tail -f /var/log/nginx/access.log | pv --line-mode --rate > /dev/null

The pvperintah cetak ke stderr saat ini jumlah baris per detik (default adalah byte per detik), yang, untuk sumber data tertentu (default file log Nginx ini), setara dengan permintaan web yang masuk per detik. Saya hanya peduli dengan hitungan, jadi saya memasukkan pipa ke /dev/null. Ada juga opsi seperti:

  • -b (jumlah total garis),
  • --average-rate (tingkat rata-rata sejak awal), dan
  • --timer (melacak berapa lama pipa telah berlangsung).

Jika Anda tidak mengatakannya --line-mode, itu akan menghitung byte, yang mungkin bukan yang Anda inginkan untuk log server, tetapi bisa berguna di tempat lain.

Catatan akhir: ... | pv -lb > file.txtsangat mirip ... | tee file.txt | awk '{printf "\r%lu", NR}', yang juga berguna untuk menghitung baris, tetapi pvpanggilannya jauh lebih pendek, meskipun outputnya tidak terlalu menarik - pvpembaruan setiap detik secara default, sementara awkperintah itu diperbarui terus menerus.


Apakah mungkin mendapatkan hanya satu nilai dari pv? Saya membutuhkan nilai rata-rata untuk periode waktu untuk tujuan pemantauan. Jadi saya perlu menetapkan nilai ke variabel.
Sonique

@Sonique itu kludge, karena bukan pvitu yang dibangun untuk (aku akan meraih awkjika aku jadi kamu), tapi tentu saja itu mungkin. Misalkan twilight stream --timeout 5adalah perintah yang akan sampel dari spritzer Twitter selama 5 detik dan kemudian berhenti: RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)", kemudian echo $RATEmenghasilkan sesuatu seperti "[40.8 / s]" (perhatikan tambahan --forcebendera, karena pv's stderrtidak lagi TTY a).
chbrown

Tampaknya tidak berfungsi dengan baik untuk saya untuk semua program; menghapus > /dev/nullpertunjukkan bahwa output sekarang "blok chunked" dan tidak lagi mengalir dengan lancar. Mungkin unbufferdiperlukan pada beberapa program produksi sehingga mereka tidak beralih untuk memblokir buffering output ketika mereka mendeteksi bahwa mereka sedang disalurkan?
nh2


1
watch -n 5 "mysqladmin status | awk -F'  ' '{ print \$NF }'"

Saya tidak bisa melakukan ini. Anda yakin tentang sintaks?
digidigo

Kesalahan apa yang Anda dapatkan? Sudahkah Anda mengonfigurasi ~/.my.cnfuntuk menjalankan mysqladmintanpa meminta kata sandi?
quanta
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.