是否存在Unix / Linux命令来计算stdin每秒的行数?


22

我正在尝试计算日志文件中每秒SQL查询的数量,我想通过将grep中的stdout通过管道传递到某些命令中来实时执行。(我正在做一些性能测试)

我可以自己写,但可以肯定会存在。

我看了看wc,但没有选择允许这样做的选项。

我还可以使用它通过访问日志中的尾巴来计数每秒的请求数。



我正在寻找这个问题所指的更普遍有用的东西。
digidigo

Answers:


2
watch -n 3 "wc -l logfile"

手册页

watch-定期执行程序,全屏显示输出默认情况下,程序每2秒运行一次;使用-n或--interval指定不同的间隔。


45

pv是您的命令!P IPE V iewer约通过它的数据,并且可以在管道运行在任何地方,因为它的管道标准输入直接到标准输出打印统计。例如:

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

pv命令向stderr显示当前每秒的行数(默认为每秒字节数),对于此特定数据源(Nginx的默认日志文件),该行数等于每秒传入的Web请求。我只关心计数,因此我将stdout传送到/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 Spritzer进行采样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 / s]”的内容(请注意附加--force标志,因为pvs stderr不再是TTY)。
chbrown '16

对于所有程序,似乎都不能对我可靠地工作;删除> /dev/null显示,表明输出现在已“分块”,并且不再流畅地传输。也许unbuffer某些生产程序需要使用它们,以使它们在检测到通过管道传递时不会切换到块输出缓冲?
nh2


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

我无法使它正常工作。您确定语法吗?
digidigo

你得到哪个错误?您是否配置~/.my.cnf为在mysqladmin不提示输入密码的情况下运行?
量子
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.