Bash: One-liner to exit with the opposite status of a grep command? Bash: One-liner to exit with the opposite status of a grep command? bash bash

Bash: One-liner to exit with the opposite status of a grep command?


Just negate the return value.

! grep -P "STATUS: (?!Perfect)" recess.txt


I came across this, needing an onlyif statement for Puppet. As such, Tgr's bash solution wouldn't work, and I didn't want to expand the complexity as in Christopher Neylan's answer.

I ended up using a version inspired by Henri Schomäcker's answer, but notably simplified:

grep -P "STATUS: (?!Perfect)" recess.txt; test $? -eq 1

Which very simply inverts the exit code, returning success only if the text is not found:

  • If grep returns 0 (match found), test 0 -eq 1 will return 1.
  • If grep returns 1 (no match found), test 1 -eq 1 will return 0.
  • If grep returns 2 (error), test 2 -eq 1 will return 1.

Which is exactly what I wanted: return 0 if no match is found, and 1 otherwise.


To make it work with set -e surround it in a sub-shell with ( and ):

$ cat test.sh #!/bin/bashset -ex(! ls /tmp/dne)echo Success$ ./test.sh + ls /tmp/dnels: cannot access /tmp/dne: No such file or directory+ echo SuccessSuccess$ mkdir /tmp/dne$ ./test.sh + ls /tmp/dne$