Có lệnh Unix / Linux để đếm dòng mỗi giây từ stdin không?


22

Tôi đang cố gắng đếm số lượng truy vấn SQL mỗi giây từ một tệp nhật ký và tôi muốn thực hiện nó trong thời gian thực bằng cách chuyển stdout từ grep vào một số lệnh. (Tôi đang thực hiện một số thử nghiệm hiệu suất)

Tôi có thể tự viết nó, nhưng nghĩ chắc chắn điều này sẽ tồn tại.

Tôi đã xem wc nhưng không thấy tùy chọn nào cho phép điều này.

Tôi cũng có thể sử dụng nó để đếm các yêu cầu mỗi giây bằng cách lấy một cái đuôi từ nhật ký truy cập.



Tôi đang tìm kiếm một cái gì đó thường hữu ích hơn những gì câu hỏi đó đề cập đến.
digidigo

Câu trả lời:


2
watch -n 3 "wc -l logfile"

trang nam

xem - thực hiện chương trình định kỳ, hiển thị toàn màn hình đầu ra Theo mặc định, chương trình được chạy cứ sau 2 giây; sử dụng -n hoặc --interval để chỉ định một khoảng khác nhau.


45

pvlà mệnh lệnh của bạn! P ipe V iewer in các số liệu thống kê về dữ liệu đi qua nó và có thể chạy bất cứ nơi nào trong đường ống của bạn, vì nó dẫn stdin trực tiếp đến thiết bị xuất chuẩn. Ví dụ:

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

Các pvbản in lệnh để thiết bị lỗi chuẩn số lượng hiện tại của các dòng trong một giây (mặc định là byte mỗi giây), trong đó, đối với nguồn dữ liệu đặc biệt này (log file mặc định Nginx của), tương đương với các yêu cầu web đến mỗi giây. Tôi chỉ quan tâm đến số lượng, vì vậy tôi bỏ ống ra /dev/null. Ngoài ra còn có các tùy chọn như:

  • -b (tổng số dòng),
  • --average-rate (tỷ lệ trung bình kể từ khi bắt đầu) và
  • --timer (theo dõi thời gian đường ống đã đi).

Nếu bạn không nói --line-mode, nó sẽ đếm byte, có lẽ không phải là thứ bạn muốn cho nhật ký máy chủ, nhưng có thể tiện dụng ở những nơi khác.

Lưu ý cuối cùng: ... | pv -lb > file.txtrất giống ... | tee file.txt | awk '{printf "\r%lu", NR}', cũng tiện cho việc đếm dòng, nhưng pvcuộc gọi ngắn hơn, mặc dù đầu ra không thú vị lắm - pvcập nhật mỗi giây theo mặc định, trong khi awklệnh đó cập nhật liên tục.


Có thể chỉ nhận được một giá trị từ pv? Tôi cần giá trị trung bình cho khoảng thời gian cho mục đích giám sát. Vì vậy, tôi cần gán giá trị cho biến.
Sonique

@Sonique đó là một loại bùn, vì đó không phải pvlà thứ được tạo ra (tôi sẽ đạt được awknếu tôi là bạn), nhưng tất nhiên là có thể. Giả sử twilight stream --timeout 5là một lệnh sẽ lấy mẫu từ spritzer Twitter trong 5 giây và sau đó thoát : RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)", sau đó echo $RATEtạo ra một cái gì đó như "[40.8 / s]" (lưu ý --forcecờ bổ sung , vì pv's stderrkhông còn là TTY).
chbrown

Dường như không hoạt động đáng tin cậy đối với tôi cho tất cả các chương trình; loại bỏ các > /dev/nullchương trình cho thấy rằng đầu ra bây giờ là "khối chunk" và không còn truyền phát trơn tru. Có lẽ unbuffercần thiết trên một số chương trình sản xuất để họ không chuyển sang chặn bộ đệm đầu ra khi họ phát hiện ra rằng chúng đang được xử lý?
nh2


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

Tôi không thể làm điều này để làm việc. Bạn có chắc về cú pháp?
digidigo

Bạn gặp lỗi gì? Bạn đã cấu hình ~/.my.cnfđể chạy mysqladminmà không cần nhập mật khẩu?
lượng tử
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.