grep usa expressões regulares por padrão, qualquer padrão dado a grep é considerado uma expressão regular, a menos que você use a opção -F .
Expressões como *? não fazem parte da linguagem POSIX regex , que é o que usa grep por padrão. Você pode usar essas construções especificando uma linguagem regex diferente, Perl, por exemplo:
$ cat a.txt
aaaaaaaa
aabbccaaaacccccccccb
bbbbbb
$ grep -oP 'a.*?b' a.txt
aab
aaaacccccccccb
Para procurar por uma linha contendo pelo menos um período, use
$ grep '\.*' foo.txt
Para uma linha contendo apenas períodos, use
$ grep '^\.*$' foo.txt
Para expressões regulares mais complexas, use -F :
$ grep -F '[a-z]*.*[AHG].*' foo.txt
[a-z]*.*[AHG].*