bash tail在一个实时日志文件中,计算具有相同日期/时间的uniq行

时间:2013-12-12 20:54:08

标签: bash logging tail uniq

我正在寻找一种在实时日志文件上拖尾的好方法,并显示具有相同日期/时间的行数。

目前正在运作:

 tail -F /var/logs/request.log | [cut the date-time] | uniq -c

但表现不够好。延迟时间超过一分钟,每次输出的行数为几行。

有什么想法吗?

3 个答案:

答案 0 :(得分:8)

您的问题很可能与您系统中的缓冲有关,而不是与您的代码行有任何本质错误。我能够创建一个可以重现它的测试场景 - 然后让它消失。我希望它也适合你。

这是我的测试场景。首先,我写一个短脚本,每100毫秒(大约)将时间写入一个文件 - 这是我的“日志文件”,它生成足够的数据uniq -c应该每秒给我一个有趣的输出:

#!/bin/ksh
while :
do
  echo The time is `date` >> a.txt
  sleep 0.1
done

(注意 - 我必须使用能够进行亚秒ksh的{​​{1}}

在另一个窗口中,我输入

sleep

果然,你每秒都会出现以下输出:

tail -f a.txt | uniq -c

等。没有延误。重要的是要注意 - 我没有尝试减少时间。接下来,我做了

   9 The time is Thu Dec 12 21:01:05 EST 2013
  10 The time is Thu Dec 12 21:01:06 EST 2013
  10 The time is Thu Dec 12 21:01:07 EST 2013
   9 The time is Thu Dec 12 21:01:08 EST 2013
  10 The time is Thu Dec 12 21:01:09 EST 2013
   9 The time is Thu Dec 12 21:01:10 EST 2013
  10 The time is Thu Dec 12 21:01:11 EST 2013
  10 The time is Thu Dec 12 21:01:12 EST 2013

你的问题再现 - 它会“挂起”很长一段时间(直到缓冲区中有4k个字符,然后它会立刻呕吐出来)。

在线搜索(https://stackoverflow.com/a/16823549/1967396)告诉我一个名为stdbuf的实用程序。在该参考文献中,它特别提到了您的场景,并提供了以下解决方法(复述以符合我上面的场景):

tail -f a.txt | cut -f7 -d' ' | uniq -c

这将是很棒的...除了我的机器(Mac OS)上不存在此实用程序 - 它特定于GNU coreutils。这让我无法测试 - 虽然它可能是一个很好的解决方案。

永远不要害怕 - 我找到了以下解决方法,基于tail -f a.txt | stdbuf -oL cut -f7 -d' ' | uniq -c 命令(我真的很难理解,但我改编自https://unix.stackexchange.com/a/25377给出的答案。)

创建一个名为socat的小文件(这是上面链接中的“long_running_command”):

tailcut.sh

使用#!/bin/ksh tail -f a.txt | cut -f7 -d' ' 授予其执行权限。然后发出以下命令:

chmod 755 tailcut.sh

而且嘿presto - 你的块状输出不再是块状。 socat EXEC:./tailcut.sh,pty,ctty STDIO | uniq -c 将脚本的输出直接发送到下一个管道,socat可以完成它。

答案 1 :(得分:2)

您可以尝试logtop,(apt-get install logtop):

用法:

tail -F /var/logs/request.log | [cut the date-time] | logtop

示例:

$ tail -f /var/log/varnish/varnishncsa.log  | awk '{print $4}' | logtop
5585 elements in 10 seconds (558.50 elements/s)
   1  690 69.00/s [28/Mar/2015:23:13:48
   2  676 67.60/s [28/Mar/2015:23:13:47
   3  620 62.00/s [28/Mar/2015:23:13:49
   4  576 57.60/s [28/Mar/2015:23:13:53
   5  541 54.10/s [28/Mar/2015:23:13:54
   6  540 54.00/s [28/Mar/2015:23:13:55
   7  511 51.10/s [28/Mar/2015:23:13:51
   8  484 48.40/s [28/Mar/2015:23:13:52
   9  468 46.80/s [28/Mar/2015:23:13:50

列从左到右:

  • 只是行号
  • qte seen
  • 每秒点击次数
  • 实际行

答案 2 :(得分:1)

考虑uniq -c的工作原理。

为了打印计数,它需要读取所有唯一的行,并且只需要一行与前一行不同,它可以打印行和出现次数。

这就是算法从根本上起作用的方式,并且没有办法解决它。

您可以通过运行

进行测试
touch a
tail -F a | uniq -c

然后一个又一个

echo 1 >> a
echo 1 >> a
echo 1 >> a
没有任何反应。只有在你运行

之后
echo 2 >> a

uniq可以打印出3“1 \ n”次出现。