How do I test (in one line) if command output contains a certain string?

Bash

Bash Problem Overview


In one line of bash, how do I return an exit status of 0 when the output of /usr/local/bin/monit --version doesn't contain exactly 5.5 and an exit status of 1 when it does?

Bash Solutions


Solution 1 - Bash

! /usr/local/bin/monit --version | grep -q 5.5

(grep returns an exit-status of 0 if it finds a match, and 1 otherwise. The -q option, "quiet", tells it not to print any match it finds; in other words, it tells grep that the only thing you want is its return-value. The ! at the beginning inverts the exit-status of the whole pipeline.)

Edited to add: Alternatively, if you want to do this in "pure Bash" (rather than calling grep), you can write:

[[ $(/usr/local/bin/monit --version) != *5.5* ]]

([[...]] is explained in §3.2.4.2 "Conditional Constructs" of the Bash Reference Manual. *5.5* is just like in fileglobs: zero or more characters, plus 5.5, plus zero or more characters.)

Solution 2 - Bash

[ $(/usr/local/bin/monit --version) == "5.5" ] 

eg-1: check for success

[ $(/usr/local/bin/monit --version) == "5.5" ] && echo "OK"

eg-2: check for failure

    [ $(/usr/local/bin/monit --version) == "5.5" ] || echo "NOT OK"

or, to just check if the output contains 5.5:

[[ $(/usr/local/bin/monit --version) =~ "5.5" ]] || echo "NOT OK"

Solution 3 - Bash

Test the return value of grep:

sudo service xyz status | grep 'not' &> /dev/null
if [ $? == 0 ]; then
   echo "whateveryouwant"
fi

I would recommend cron, it works fine with SALT stack

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDane O'ConnorView Question on Stackoverflow
Solution 1 - BashruakhView Answer on Stackoverflow
Solution 2 - BashperrealView Answer on Stackoverflow
Solution 3 - BashMatzyView Answer on Stackoverflow