Dado
$ cat file
Good-Black-Cat
Bad-Red-Cat
Bad-Gray-Dog
Good-Golden-Dog
Bad-White-Dog
Good-Tabby-Cat
Bad-Siamese-Cat
então
$ grep -c 'Good-.*-Cat' file
2
Observe que essa é uma contagem de linhas correspondentes - por exemplo, não funcionará para várias ocorrências por linha ou para ocorrências que abranjam linhas.
Como alternativa, com awk
awk '/Good-.*-Cat/ {n++} END {print n}' file
Se você precisar corresponder várias ocorrências possíveis por linha, sugiro perl :
perl -lne '$c += () = /Good-.*?-Cat/g }{ print $c' file
em que /Good-.*?-Cat/g corresponde a várias vezes ( g ) e não-avidamente * ( .*? ) e a atribuição () = força as correspondências a serem avaliadas em um contexto escalar para que pode adicioná-los à contagem.
Como alternativa, você pode usar grep no modo de expressão regular perl-comparavel (PCRE), para habilitar o modificador não-ganancioso, com -o para exibir apenas as partes correspondentes e depois contar com wc :
grep -Po 'Good-.*?-Cat' file | wc -l
Se você também precisa coincidir com ocorrências que podem se estender por um limite de linha, você pode fazer isso em perl desmarcando o separador de registro (nota: isso significa que todo o arquivo foi sugado para a memória) e adicionando o s regex modifier eg
perl -0777 -nE '$c += () = /Good-.*?-Cat/gs }{ say $c' file