是否可以在连续流上使用grep?
我的意思是有点像tail-f<file>命令,但输出上有grep,以便只保留我感兴趣的行。
我尝试过tail-f<file>|grep模式,但似乎只有在tail完成后才能执行grep,也就是说永远不会执行。
是否可以在连续流上使用grep?
我的意思是有点像tail-f<file>命令,但输出上有grep,以便只保留我感兴趣的行。
我尝试过tail-f<file>|grep模式,但似乎只有在tail完成后才能执行grep,也就是说永远不会执行。
当前回答
是的,这实际上会很好。Grep和大多数Unix命令一次只能对一行流进行操作。每一条从尾部出来的线都会被分析,如果匹配的话就会被传递。
其他回答
是的,这实际上会很好。Grep和大多数Unix命令一次只能对一行流进行操作。每一条从尾部出来的线都会被分析,如果匹配的话就会被传递。
在没有行缓冲选项的地方,使用awk(另一个很棒的bash实用程序)而不是grep!它将不断地从尾部传输数据。
这是如何使用grep的
tail -f <file> | grep pattern
这就是你使用awk的方式
tail -f <file> | awk '/pattern/{print $0}'
如果你想在整个文件中找到匹配项(而不仅仅是尾部),并且你想让它坐下来等待任何新的匹配项,这很好:
tail -c +0 -f <file> | grep --line-buffered <pattern>
-c+0标志表示输出应该从文件开头(+)开始0字节(-c)。
我认为你的问题是grep使用了一些输出缓冲。尝试
tail -f file | stdbuf -o0 grep my_pattern
它将grep的输出缓冲模式设置为无缓冲。
在大多数情况下,您可以跟踪-f/var/log/some.log | grep-foo,它会很好地工作。
如果需要在运行的日志文件上使用多个grep,并且发现没有输出,则可能需要将--line缓冲开关插入中间的grep,如下所示:
tail -f /var/log/some.log | grep --line-buffered foo | grep bar