Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash grep与wc-l缓存计数_Bash_Shell_Unix_Grep_Ubuntu 16.04 - Fatal编程技术网

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工作正常,正在更新计数。