Есть ли команда Unix / Linux для подсчета строк в секунду от стандартного ввода?


22

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

Я мог бы написать это сам, но думал наверняка, что это будет.

Я посмотрел на туалет, но не увидел возможности разрешить это.

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



Я ищу что-то более общее, полезное, к чему относится этот вопрос.
Digidigo

Ответы:


2
watch -n 3 "wc -l logfile"

справочная страница

watch - периодически запускать программу, отображая вывод в полноэкранном режиме. По умолчанию программа запускается каждые 2 секунды; используйте -n или --interval, чтобы указать другой интервал.


45

pvэто ваша команда! P фе V iewer печатает статистику о прохождении данных через него, и может работать в любом месте трубопровода, так как это трубы стандартного ввода непосредственно через стандартный вывод. Например:

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

Команда pvвыводит в stderr текущее количество строк в секунду (по умолчанию - байты в секунду), что для данного конкретного источника данных (файл журнала по умолчанию 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

@ Sonique - это клочок, потому что это не то, pvдля чего он создан (я бы достиг этого на awkвашем месте), но, конечно, это возможно. Предположим twilight stream --timeout 5, это команда, которая в течение 5 секунд будет выполнять выборку из спритцера Twitter, а затем завершать работу 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 / s]» (обратите внимание на дополнительный --forceфлаг, поскольку pvs stderrбольше не является TTY).
февраля

Кажется, не работает для меня надежно для всех программ; удаление > /dev/nullпоказывает, что выходные данные теперь «блочные» и больше не передаются плавно. Возможно, unbufferэто необходимо для некоторых производящих программ, чтобы они не переключались на выходную буферизацию блоков, когда обнаруживали, что они передаются по каналу?
nh2

13

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

tail -f foobar.log |logtop

Это вершина журнала, на которую вы ссылаетесь? github.com/JulienPalard/logtop
digidigo

Да, если вы используете debian, в хранилище пакетов
package.debian.org/wheezy/logtop

черт, я думаю, что это то, что мне нужно, но я не смог заставить его скомпилировать в CentOs
digidigo

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

Я не мог заставить это работать. Вы уверены в синтаксисе?
Digidigo

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