Ok, I got it. And this would do the opposite:
(! ping 127.0.0.1 -c 1 | grep "64 bytes") || echo "Host is up.";
Ok, I got it. And this would do the opposite:
(! ping 127.0.0.1 -c 1 | grep "64 bytes") || echo "Host is up.";
umm.. no, the NOT (!) should be outside the parenthesis, although I'm no bash expert to know what that eventually should mean.

Sso the opposite should be:

(ping 127.0.0.1 -c 1 | grep "64 bytes") && echo "Host is up.";

Update: I have updated my previous post.
Ok, I got it. And this would do the opposite:
(! ping 127.0.0.1 -c 1 | grep "64 bytes") || echo "Host is up.";
umm.. no, the NOT (!) should be outside the parenthesis, although I'm no bash expert to know what that eventually should mean.
[root@summer root]# (! ping 127.0.0.1 -c 1 | grep "64 bytes") || echo "Host is up."
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.196 ms
Host is up.
[root@summer root]# !(ping 127.0.0.1 -c 1 | grep "64 bytes") || echo "Host is up."
-bash: !: event not found

Actually in the bash manpage, the ! is referenced 3 times:

In "Pipelines":
If the reserved word ! precedes a pipeline, the exit status of that
pipeline is the logical NOT of the exit status of the last command.

In "Expressions":
example: ! expression
True if expression is false.

In "Parameters":
! Expands to the process ID of the most recently executed back-
ground (asynchronous) command.

Now dont ask me how the shell chooses between the "expressions" context and the "parameters" context.