If you have GNU grep, you can use [Perl regular expressions](http://perldoc.perl.org/perlre.html#Regular-Expressions), which have a [negation construct](http://perldoc.perl.org/perlre.html#(%3f!pattern)).

 grep -A1 -P '^(?!.*ignore me).*needle'

If you don't have GNU grep, you can [emulate its before/after context options in awk](http://unix.stackexchange.com/questions/11193/is-there-any-alternative-to-greps-a-b-c-switches-to-print-few-lines-before/11201#11201).

 awk -v after=3 -v before=2 '
 /needle/ && !/ignore me/ {
 for (i in h) {
 print h[i];
 delete h[i];
 }
 until = NR + after;
 }
 {
 if (NR <= until) print $0; else h[NR] = $0;
 delete h[NR-before];
 }
 END {exit !until}
 '