Bash grep与wc-l缓存计数
我注意到当使用下面的命令进行行计数时,多次显示缓存的结果,你知道为什么吗Bash grep与wc-l缓存计数,bash,shell,unix,grep,ubuntu-16.04,Bash,Shell,Unix,Grep,Ubuntu 16.04,我注意到当使用下面的命令进行行计数时,多次显示缓存的结果,你知道为什么吗 grep "xxx" "filename.log" | wc -l 这将在第一次运行时返回计数值,如果再次运行,则仍会给出相同的计数值,即使文件具有更多匹配值 原因可能是什么 PS-我正在使用ubuntu 16.04 LTS 更新-grep-c“xxx”文件名。日志返回正确的计数。仍然想知道为什么上面的命令没有给出更新的结果 如何确保缓冲区定期写入文件 仅供参考-我正在一个nginx访问日志文件上检查这一点,该文件会随着
grep "xxx" "filename.log" | wc -l
这将在第一次运行时返回计数值,如果再次运行,则仍会给出相同的计数值,即使文件具有更多匹配值
原因可能是什么
PS-我正在使用ubuntu 16.04 LTS
更新-grep-c“xxx”文件名。日志返回正确的计数。仍然想知道为什么上面的命令没有给出更新的结果
如何确保缓冲区定期写入文件
仅供参考-我正在一个nginx访问日志文件上检查这一点,该文件会随着请求调用不断更新,平均写入速度为10行/秒。
如果新的xxx
事件与旧的事件在同一行上,这是可以的,因为grep
默认输出整行。您可以使用grep-o
在单独的行中输出单个匹配项。顺便说一句,grep-c
(或grep-o-c
)可以用于计数(因为它涉及更少的写入,所以速度更快)
但是,如果您认为文件中的新行已写入(可以使用tail-f
或less
连续检查:按f
读取新数据,按Ctrl-C
停止读取),可能的原因是缓冲。(关于您对24小时的评论:请注意,缓冲区不会随着时间的推移而简单地刷新,只有缓冲区会溢出或显式刷新。)您可以尝试调用stdbuf-o0程序…
而不是program…
在匹配计数时,您的文件是否会动态更新?是的,它会动态更新。我认为缓冲区是根本原因,但即使24小时后仍然是一样的。我没有你的答案,但我的第一步是尝试grep-c xxx filename.log
。我假设您已经100%确定新的行确实已经添加到文件中-而不仅仅是传递到某个正在运行的程序的“打印”函数并在其I/O缓冲区中等待。grep-c正在返回正确的计数,wc-l不返回的原因是什么?严格地说,根据POSIX规范,不以换行符结尾的字符序列不是一行grep-c
显然比wc-l
更能自由地决定什么构成一条线。但这只能解释1的差异,因为您的文件不能有多个不以换行结尾的“行”。@mdeora和grep…|wc-l
不是吗?它给出了旧计数,这是我昨天运行该文件时给出的。而grep-c“xxx”filename.log给出了最新计数。我已经更新了我的问题。@mdeora这很奇怪。我刚刚测试过:即使文件内容不是以\n
结尾,它们都是grep…|wc-l和grep-c的行为就好像是这样。那格雷普呢尾部
?它是否显示最新的行?是的,它有点奇怪,这就是我发布它的原因,让我也检查一下。grep…|tail工作正常,正在更新计数。