是否可以在连续流上使用grep?
我的意思是有点像tail-f<file>命令,但输出上有grep,以便只保留我感兴趣的行。
我尝试过tail-f<file>|grep模式,但似乎只有在tail完成后才能执行grep,也就是说永远不会执行。
是否可以在连续流上使用grep?
我的意思是有点像tail-f<file>命令,但输出上有grep,以便只保留我感兴趣的行。
我尝试过tail-f<file>|grep模式,但似乎只有在tail完成后才能执行grep,也就是说永远不会执行。
当前回答
sed将是更好的选择(流编辑器)
tail-n0-f<file>| sed-n‘/search string/p‘
然后,如果您希望在找到特定字符串后退出tail命令:
tail--pid=$(($BASHPID+1))-n0-f<file>|sed-n'/search string/{p;q}'
显然是一种抨击:$BASHPID将是tail命令的进程id。sed命令在管道中位于tail之后,因此sed进程id将为$BASHPID+1。
其他回答
你肯定不会成功
tail -f /var/log/foo.log |grep --line-buffered string2search
当您使用“colortail”作为tail的别名时,例如在bash中
alias tail='colortail -n 30'
你可以通过类型别名如果这个输出类似tail是colortail-n30的别名。那你就有你的罪魁祸首了:)
解决方案:
使用删除别名
unalias tail
确保通过此命令使用的是“real”尾部二进制文件
type tail
它应该输出如下内容:
tail is /usr/bin/tail
然后可以运行命令
tail -f foo.log |grep --line-buffered something
祝你好运
我认为你的问题是grep使用了一些输出缓冲。尝试
tail -f file | stdbuf -o0 grep my_pattern
它将grep的输出缓冲模式设置为无缓冲。
我一直使用tail-f<file>|grep<pattern>。
它会等到grep刷新,而不是等到它完成(我使用的是Ubuntu)。
在大多数情况下,您可以跟踪-f/var/log/some.log | grep-foo,它会很好地工作。
如果需要在运行的日志文件上使用多个grep,并且发现没有输出,则可能需要将--line缓冲开关插入中间的grep,如下所示:
tail -f /var/log/some.log | grep --line-buffered foo | grep bar
是的,这实际上会很好。Grep和大多数Unix命令一次只能对一行流进行操作。每一条从尾部出来的线都会被分析,如果匹配的话就会被传递。