Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to grep and then fail an if-statement on specific output from grep?

Ok I need to find the output that a command gives, notely "gbak: ERROR" and then fail on it. I don't know if I'm going about it the right way, I tried to make if fail if the grep did an output to /dev/null but I couldn't get that working either (probably just poor syntax). I'm sure this is a simple one, please let me know.

The if statement I've got at the moment is:

if [ `sudo -u firebird $GBAK_COMMAND | grep "gbak: ERROR"` == *gbak: ERROR* ]; then
   echo "$DATE Unsucessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages
   echo "Failed"
   exit 1
else
   echo "pass"
fi
like image 579
edumike Avatar asked Mar 08 '11 01:03

edumike


1 Answers

You don't need the 'test' operator square brackets; just test the exit status of grep:

if sudo -u firebird $GBAK_COMMAND | grep -q "gbak: ERROR"
then
   echo "$DATE Unsuccessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages
   echo "Failed"
   exit 1
else
   echo "pass"
fi

The -q option to grep suppresses all output (POSIX and GNU variants) so you just get the status, which the if tests. If grep finds the pattern, it returns success, which means that the firebird command failed. The only residual issue is 'does firebird write its error to standard output or to standard error?' If you need to redirect the standard error, write:

if sudo -u firebird $GBAK_COMMAND 2>&1 | grep -q "gbak: ERROR"
then
   echo "$DATE Unsuccessful $1.gdb Gbak. Incorrect user/password" >> /var/log/messages
   echo "Failed"
   exit 1
else
   echo "pass"
fi
like image 198
Jonathan Leffler Avatar answered Oct 14 '22 22:10

Jonathan Leffler