Issue
I want to do a tail -F
on a file until matching a pattern. I found a way using awk
, but IMHO my command is not really clean. The problem is that I need to do it in only one line, because of some limitations.
tail -n +0 -F /tmp/foo | \
awk -W interactive '{if ($1 == "EOF") exit; print} END {system("echo EOF >> /tmp/foo")}'
The tail will block until EOF
appears in the file. It works pretty well. The END block is mandatory because awk's exit
does not exit right away. It makes awk
to eval
the END block before quitting. The END block hangs on a read call (because of tail), so the last thing I need to do, is to write another line in the file to force tail to exit.
Does someone know a better way to do that?
Solution
Try this:
sh -c 'tail -n +0 -f /tmp/foo | { sed "/EOF/ q" && kill $$ ;}'
The whole command-line will exit as soon as the "EOF" string is seen in /tmp/foo
.
There is one side-effect: the tail
process will be left running (in the background) until anything is written to /tmp/foo
.
Answered By - jpetazzo