加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:19:15 所属栏目:安全 来源:网络整理
导读:我正在寻找一种在实时日志文件上拖尾的好方法,并显示具有相同日期/时间的行数. 目前这是有效的: tail -F /var/logs/request.log | [cut the date-time] | uniq -c 但性能不够好.延迟超过一分钟,并且每次以少量线路输出. 任何的想法? 解决方法 您的问题很可
我正在寻找一种在实时日志文件上拖尾的好方法,并显示具有相同日期/时间的行数.

目前这是有效的:

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

但性能不够好.延迟超过一分钟,并且每次以少量线路输出.

任何的想法?

解决方法

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

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

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

(注意 – 我必须使用能够进行亚秒睡眠的ksh)

在另一个窗口中,我输入

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

等没有延误.重要的是要注意 – 我没有试图减少时间.接下来,我做到了

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

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

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

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

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

永远不要害怕 – 我找到了以下解决方法,基于socat命令(我真的很难理解,但我改编自https://unix.stackexchange.com/a/25377给出的答案).

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

#!/bin/ksh
tail -f a.txt | cut -f7 -d' '

使用chmod 755 tailcut.sh赋予它执行权限.然后发出以下命令:

socat EXEC:./tailcut.sh,pty,ctty STDIO | uniq -c

嘿presto – 你的块状输出不再是块状. socat将脚本的输出直接发送到下一个管道,uniq可以做到这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读