Чи існує команда Unix / Linux для підрахунку рядків в секунду від stdin?


22

Я намагаюся підрахувати кількість запитів SQL в секунду з файлу журналу, і хочу це зробити в режимі реального часу, передаючи stdout від grep в якусь команду. (Я роблю тестування на продуктивність)

Я міг би написати це сам, але подумав напевно, що це буде.

Я подивився на wc, але не побачив варіанту, щоб дозволити це.

Я також міг би використати його для підрахунку запитів за секунду, проклавши хвіст із журналу доступу.



Я шукаю щось більш корисне, що стосується цього питання.
дигідіго

Відповіді:


2
watch -n 3 "wc -l logfile"

сторінка man

watch - періодично виконувати програму, показуючи вихідний повноекранний екран За замовчуванням програма запускається кожні 2 секунди; використовуйте -n або --interval, щоб вказати інший інтервал.


45

pvце ваша команда! P ipe V iewer друкує статистику про дані, що проходять через нього, і може працювати будь-де у вашому трубопроводі, оскільки він передається безпосередньо на stdout. Наприклад:

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

У pvкоманда виводить на стандартний висновок поточне число рядків в секунду (за замовчуванням байт в секунду), що для цього конкретного джерела даних (файл журналу Nginx за замовчуванням), прирівнює до вхідних веб - запитів в секунду. Мене дбає тільки про підрахунки, тому я маю на увазі прокладку /dev/null. Також є такі варіанти, як:

  • -b (загальна кількість рядків),
  • --average-rate (середня ставка з моменту початку) та
  • --timer (відстежує, як довго труба ходила).

Якщо ви не скажете --line-mode, він буде рахувати байти, що, мабуть, не те, що ви хочете для журналів сервера, але це може бути зручно в іншому місці.

Підсумкове зауваження: ... | pv -lb > file.txtдуже схоже ... | tee file.txt | awk '{printf "\r%lu", NR}', що також зручно для підрахунку рядків, але pvвиклик набагато коротший, хоча вихід не такий вже й захоплюючий - pvоновлюється щосекунди за замовчуванням, тоді як ця awkкоманда постійно оновлюється.


Чи можна отримати лише одне значення з pv? Мені потрібно середнє значення за період часу для моніторингу. Тому мені потрібно присвоїти значення змінній.
Сонік

@Sonique - це хитрість, оскільки це не для чого pvпобудовано (я б дотягнувся, awkякби я був ти), але, звичайно, це можливо. Припустимо twilight stream --timeout 5, це команда, яка буде вибирати з шрифту Twitter ще 5 секунд, а потім вийти:, RATE="$(twilight stream --timeout 5 | pv --line-mode --rate --force 2>&1 1>/dev/null | tr -s '\r\n' '\n' | tail -1)"потім echo $RATEвиробляє щось на кшталт "[40,8 / с]" "(зверніть увагу на додатковий --forceпрапор, оскільки pv's stderrбільше не є TTY).
chbrown

Здається, це не працює для мене надійно для всіх програм; видалення > /dev/nullпоказує, що вихід зараз "блокований" і більше не протікає гладко. Можливо, unbufferце потрібно деяким виробляючим програмам, щоб вони не переходили на блокування вихідної буферизації, коли виявляють, що вони переносяться?
nh2

13

Може, варто спробувати logtop?

tail -f foobar.log |logtop

Це верхній журнал, на який ви посилаєтесь? github.com/JulienPalard/logtop
digidigo

Так, якщо ви використовуєте debian, є пакет у сховища пакетів.debian.org
wheezy/logtop

dang Я думаю, що це те, що мені потрібно, але я не зміг його скласти на CentOs
digidigo

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

Я не міг змусити це працювати. Ви впевнені в синтаксисі?
дигідіго

Яку помилку ви отримаєте? Ви налаштували ~/.my.cnfзапуск mysqladminбез запиту пароля?
кванта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.