O problema é que grep -v corresponderá a linhas que não correspondem à expressão, e não a arquivos que não correspondem a ela ...
Portanto, se o arquivo tiver qualquer linhas que não correspondam a ele, grep -v corresponderá a essas linhas e, assim, o grep retornará com êxito.
Uma abordagem melhor é usar uma correspondência positiva para a palavra-chave e usar || (em vez de && ) para anexar a linha, se necessário:
grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf
Você provavelmente fez seu teste com echo "the line is absent" para dizer que estava ausente quando estava realmente ausente ... E talvez não fazer nada se essa fosse a única linha . Se você testar isso ainda mais, acho que verá que, desde que tenha linhas que não correspondam à palavra-chave, você obterá uma correspondência.
Espero que isso o esclareça!