31

Hi I wanna keep looking at a log file, but I also don't wanna see irrelevant stuff, I'm only interested in anything with "foobar" in it.

So if I was tailing the file I would do

 tail file | grep "foobar"

Now that I'm adding the -f option, is there a way to somehow only show the stuff that I want? using grep or other technique?

user893730
  • 1,207
  • 3
  • 18
  • 24
  • 1
    It appears your answer is already written here: http://stackoverflow.com/questions/5427483/tail-pipe-to-grep-pipe-to-another-grep-seems-to-be-a-pipe-too-far – uSlackr Jan 09 '12 at 16:58
  • 1
    It appears that xyr answer is in the question. – JdeBP Jan 09 '12 at 17:02

1 Answers1

47

You almost wrote the answer, which is :

tail -f file.log | grep "foobar"

That's it.

Ravachol
  • 1,250
  • 9
  • 10
  • 1
    Woah, you are right, I think I didn't expect this to work, I still don't, isn't piping supposed to happen when a command has finished execution? I guess this shows that it's not, it happens every time there an output, right? – user893730 Jan 09 '12 at 21:15
  • 3
    No it will launch the two programs in parallel, and the second one (grep) will exit as soon as tail's STDOUT closes. That's the whole point of pipes, data streaming :) – Ravachol Jan 10 '12 at 09:57
  • 6
    When `grep` is the last line in the pipe, its output is line buffered, so you see the filtered output of `tail -f` live, rather than delayed. Note that if you were to use multiple `grep` commands, any whose output was piped would need a `--line-buffered` option (assuming GNU or BSD grep) in order to keep this behaviour. – ghoti Jul 04 '13 at 06:44