Se a sua versão de grep for compatível com PCRE (o% GNU grep faz isso com a opção -P ou --perl-regexp ), você pode usar lookaheads para corresponder várias palavras em qualquer ordem:
grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word3)^.*$'
Isso não destacará as palavras, no entanto. Lookaheads são asserções de comprimento zero, não fazem parte da sequência correspondente.
Acho que sua solução de tubulação deve funcionar para isso. Por padrão, grep apenas colore a saída quando estiver indo para um terminal, portanto, somente o último comando no pipeline será realçado, mas você pode substituir isso com --color=always .
grep --color=always foo | grep --color=always bar