See below for the script used in these tests.
Grep can only operate on stdin, so therefore you must convert the stderr stream in a form that Grep can parse.
Normally, stdout and stderr are both printed to your screen:
$ ./stdout-stderr.sh
./stdout-stderr.sh: Printing to stdout
./stdout-stderr.sh: Printing to stderr
To hide stdout, but still print stdout do this:
$ ./stdout-stderr.sh >/dev/null
./stdout-stderr.sh: Printing to stderr
But grep won't operate on stderr! You would expect the following command to suppress lines which contain 'err', but it does not.
$ ./stdout-stderr.sh >/dev/null |grep --invert-match err
./stdout-stderr.sh: Printing to stderr
Here's the solution.
The following Bash syntax will hide output to stdout, but will still show stderr. First we pipe stdout to /dev/null, then we convert stderr to stdout, because Unix pipes will only operate on stdout. You can still grep the text.
$ { ./stdout-stderr.sh >/dev/null ; } 2>&1 | grep err
./stdout-stderr.sh: Printing to stderr
Here's the script used for testing. This prints one line to stdout and one line to stderr:
#!/bin/sh
# Print a message to stdout
echo "$0: Printing to stdout"
# Print a message to stderr
echo "$0: Printing to stderr" >&2
exit 0