可以grep
在连续流上使用吗?
我的意思是说是一条tail -f <file>
命令,但grep
在输出中仅保留我感兴趣的行。
我已经尝试过,tail -f <file> | grep pattern
但是似乎grep
只能在tail
完成后才能执行,也就是说永远不会执行。
tail -f file
作品(我实时看到了新的输出)
可以grep
在连续流上使用吗?
我的意思是说是一条tail -f <file>
命令,但grep
在输出中仅保留我感兴趣的行。
我已经尝试过,tail -f <file> | grep pattern
但是似乎grep
只能在tail
完成后才能执行,也就是说永远不会执行。
tail -f file
作品(我实时看到了新的输出)
Answers:
grep
使用BSD grep(FreeBSD,Mac OS X等)时,打开的行缓冲模式。
tail -f file | grep --line-buffered my_pattern
您无需为GNU grep(几乎在任何Linux上使用)执行此操作,因为它会默认刷新(对于其他类似Unix的版本,如SmartOS,AIX或QNX,则为YMMV)。
strace
。没有--line-buffered
,它将无法正常工作。
tail -f | grep
,并--line-buffered
为我解决了这个问题(在Ubuntu 14.04,GNU grep版本2.16上)。哪里实现了“如果stdout是tty,则使用行缓冲”逻辑?在git.savannah.gnu.org/cgit/grep.git/tree/src/grep.c中,line_buffered
仅由参数解析器设置。
--line-buffered
我没有输出。但是,经过测试,看起来GNU grep可以完成您所描述的工作。因此,与大多数Unix一样,它取决于您平台的实现。由于问题未指定平台,因此您的信息似乎是错误的-在查看了BSD grep的代码并将其与GNU grep进行比较之后,该行为肯定由--line-buffered选项控制。只是默认情况下只有GNU grep刷新。
我tail -f <file> | grep <pattern>
一直都在用。
它将等到grep刷新,而不是等到完成(我正在使用Ubuntu)。
我认为您的问题是grep使用了一些输出缓冲。尝试
tail -f file | stdbuf -o0 grep my_pattern
它将grep的输出缓冲模式设置为unbuffered。
grep
。
unbuffer
(在expect-dev
debian 的软件包中)是king。因此,我将对stdbuf使用unbuffer。
top
与stdbuf和unbuffer 进行交互)。确实没有“魔术”解决方案:取消缓冲有时也会失败,例如awk使用不同的缓冲实现(stdbuf也将失败)。
stdbuf
像素缓冲,解缓冲和stdio缓冲的更多信息,请访问pixelbeat.org/programming/stdio_buffering
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命令位于管道尾部之后,因此sed进程ID为$ BASHPID + 1。
$BASHPID+1
在许多情况下,假设系统()上启动的下一个进程将是您的,这是错误的,这并不能解决缓冲问题,这可能是OP试图解决的问题。特别是,sed
在grep
这里推荐似乎只是(可疑)偏好问题。(如果这是您要传达的要点,您可能会得到p;q
举止grep -m 1
。)
--line-buffered
没有。我衷心不懂减1
是的,这实际上可以正常工作。Grep
大多数Unix命令一次只能在一行上对流进行操作。从尾部出来的每条线都将被分析并传递(如果匹配)。
grep
是管道链中的最后一条命令,它将按照您的解释进行操作。但是,如果它在中间,它将一次缓冲大约8k的输出。
你当然不会成功
tail -f /var/log/foo.log |grep --line-buffered string2search
当您使用“ colortail”作为尾巴的别名时,例如。猛扑
alias tail='colortail -n 30'
您可以按别名类型检查输出的内容是否类似于tail isan alias of colortail -n 30
。那么你有罪魁祸首:)
解:
用删除别名
unalias tail
确保通过此命令使用“真实”尾巴二进制文件
type tail
应该输出如下内容:
tail is /usr/bin/tail
然后您可以运行命令
tail -f foo.log |grep --line-buffered something
祝好运。