Se o segundo termo estiver vazio ou não definido, não execute o segundo grep :
grep -e "$term1" <file |
if [ -n "$term2" ]; then
grep -e "$term2"
else
cat
fi
Isso aplica grep com o padrão em $term1 ao arquivo chamado file e, dependendo se $term2 não está vazio, aplica um segundo grep ao resultado ou usa cat como um filtro de passagem.
Observe que isso efetivamente implementa " term1 AND term2 ", exceto quando term2 está vazio no qual se degenera em apenas " term1 ".
Se preferir não executar grep e, em vez disso, retornar um resultado vazio quando o segundo termo estiver vazio:
if [ -n "$term2" ]; then
grep -e "$term1" <file | grep -e "$term2"
fi
Isso efetivamente implementa " term1 AND term2 " e trata um term2 vazio como "falso".
O benefício disso é que ela depende apenas do padrão grep e de que os dois padrões são mantidos separados, o que facilita a compreensão e a manutenção.