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.

digidigo
sumber
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.

Nim
sumber
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.

chbrown
sumber
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
13

Mungkin Anda harus mencobanya logtop?

tail -f foobar.log |logtop
klocek
sumber
Apakah ini log top yang Anda maksud? github.com/JulienPalard/logtop
digidigo
Ya, jika Anda menggunakan debian, ada paket di repositori packages.debian.org/wheezy/logtop
klocek
dang saya pikir ini yang saya butuhkan tetapi saya tidak bisa mengkompilasinya pada CentOs
digidigo
1
watch -n 5 "mysqladmin status | awk -F'  ' '{ print \$NF }'"
kuanta
sumber
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