bash tail在一个实时日志文件中,计算具有相同日期/时间的uniq行
我正在寻找一种在实时日志文件上拖尾的好方法,并显示具有相同日期/时间的行数.
目前这是有效的: 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可以做到这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |