Grep mainly looks for lines that contain a match for the given pattern. Depending on the pattern, it may or may not be possible to determine whether a line matches without looking at the whole line. With
grep Match, this is possible, but with
grep 'Match$', it isn't. With
grep -o Match, grep could print
Match as soon as it sees it, but with
grep -E -o '(Match)+', if grep has read
MatchMa, it doesn't know whether
tch will follow or not.
Grep does not implement the special cases where it would be possible to write some output before seeing a whole line. (I think it doesn't implement any such special case, but I'm not completely sure: GNU grep has several modes depending on the pattern that behave somewhat differently.) It just reads one whole line before trying to match.
If there's a character that's never appears in matching text and that always (or at least often) appear between matches, transform this character into a newline. (Or into a null byte and use
while true; do printf "Match Unmatch"; sleep 1s; done | stdbuf -o0 tr ' ' '\n' | grep -o "Match"
Note the use of
stdbuf -o0 to prevent
tr from buffering its output. And if you pipe the output of grep, you'll need that for grep as well, or use
grep --line-buffered. (
--line-buffered buffers the output of grep; it has no impact on how grep reads input, and it's on by default when grep is printing to a terminal.)