grep和tail -f?


28

是否可以tail -f在一个文件上同时执行(或类似操作)grep?我不会介意其他命令只是在寻找这种行为。

Answers:


46

使用GNU tail和GNU grep,我可以tail -f使用简单的语法grep a :

tail -f /var/log/file.log | grep search_term

这是一个可以与这两个实用程序的其他实现一起使用的解决方案,而不仅仅是GNU实现。
Kusalananda

7

它将正常工作;更一般而言,grep将在程序不输出时等待,并在输出进入时继续读取,因此,如果这样做:

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

5秒钟什么都不会发生,然后grep将输出匹配的“测试”,然后5秒钟后,当管道处理完成时,它将退出


7

添加--line-bufferedgrep,这可能会减少延迟。在某些情况下非常有用。

tail -f foo | grep --line-buffered bar

2
当的输出grep不发送到终端(重定向到另一种文件)时,这很有用。输出到终端时,行缓冲是默认设置,因此在那里没有任何区别。请注意,该选项是特定于GNU的。
斯特凡Chazelas


2

我看到所有这些人都说要使用tail -f,但是我不喜欢这样的限制!我最喜欢的在搜索文件的同时还要监视新行的方法(例如,我通常使用日志文件,该文件附加了通过cron作业定期执行的进程的重定向输出):

 tail -Fn+0 /path/to/file|grep searchterm

假设使用GNU tail和grep。尾页帮助页面中的支持详细信息(GNU coreutils,我的版本是v8.22)[ https://www.gnu.org/software/coreutils/manual/coreutils.html]

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

因此,我命令的尾部等于tail --follow --retry --lines=+0,其中final参数将其从开头开始,跳过零行。


1
tail -f access | awk '/ADD/{print $0}'

使用以上,我通常使用它。


0

您可以使用netcat来grep tail -f的结果,因为新结果非常容易输入。

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337


会将grep设置为侦听来自端口1337 的输入的结果。第二个命令将tail -f的输出通过管道传送到netcat并将其发送到localhost1337。要在本地执行此操作,您需要为两组命令中的每组切换ttys ,或使用类似screen之类的东西。


0

有用。但是请注意,输出不再是瞬时的:它通过管道进行缓冲。


同意 要对此进行测试,请打开两个窗口。tail -f在一个窗口中运行,在另一个窗口中运行tail -f logfile | grep pattern。包含的pattern行并非总是同时出现在两个窗口中。我已经看到,在极少数情况下,行距相隔30秒,这很烦人。
Stefan Lasiewski,2010年

这可能与系统在运行一个或另一个tail实例之间进行翻转有关。一个更好的测试会是我们tee还是什么。
凯文·坎图
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.