(Soluções aqui assumindo o GNU grep quando construído com suporte a PCRE (como é tipicamente o caso no cygwin)).
A primeira metade de seus requisitos significaria.
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*(?1)\w*'
Ou possivelmente:
grep -Pwo '(abc|acb|bac|bca|cab|cba)\w*\w*'
Para o segundo semestre que parece contradizer o primeiro semestre:
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!)(?1)'
Encontraria as palavras ( palavra sendo definida como uma seqüência de [a-zA-Z0-9_] caracteres neste caso) que começam com uma sequência de 3 caracteres composta por a , b e c (um de cada) seguido por outra dessas sequências ( (?1) referindo-se ao mesmo regexp que no primeiro grupo (...) ), desde que não seja igual ao primeiro ( refere-se à cadeia que foi correspondida pelo primeiro grupo de captura (...) e (?!...) é um operador negativo antecipado ).
$ echo abcbca abcbcax abcabc aaabbb xcabacb abcacb-blah |
grep -Pwo '(abc|acb|bac|bca|cab|cba)(?!)(?1)'
abcbca
abcacb