Tuesday, January 25, 2011

echo based on grep result

I need a one liner which displays 'yes' or 'no' whether grep finds any results.

I have played with grep -c, but without success.

  • How about:

    uptime | grep user && echo 'yes' || echo 'no'
    uptime | grep foo && echo 'yes' || echo 'no'
    

    Then you can have it quiet:

    uptime | grep --quiet user && echo 'yes' || echo 'no'
    uptime | grep --quiet foo && echo 'yes' || echo 'no'
    

    From the grep manual page:

    EXIT STATUS

    Normally, the exit status is 0 if selected lines are found and 1 otherwise. But the exit status is 2 if an error occurred, unless the -q or --quiet or --silent option is used and a selected line is found.

    From Weboide
  • I don't think u can do it with grep alone. Is it possible to put a bash script around it?

    kaerast : The question wasn't whether grep can do it alone, the question was how to do something based on the results of grep.
    From Pimmetje
  • Not sure what you mean by "one liner", for me this is a "one liner"

    Just add ; if [ $? -eq 0 ]; then echo "Yes"; else echo "No"; fi after you grep command

    bash$ grep ABCDEF /etc/resolv.conf; if [ $? -eq 0 ]; then echo "Yes"; else echo "No"; fi
    No
    bash$ grep nameserver /etc/resolv.conf; if [ $? -eq 0 ]; then echo "Yes"; else echo "No"; fi
    nameserver 212.27.54.252
    Yes
    

    Add -q flag to grep if you want to supress grep result

    bash$ grep -q nameserver /etc/resolv.conf; if [ $? -eq 0 ]; then echo "Yes"; else echo "No"; fi
    Yes
    
    From radius
  • This version is intermediate between Weboide's version and radius's version:

    if grep --quiet foo bar; then echo "yes"; else echo "no"; fi
    

    It's more readable than the former and it doesn't unnecessarily use $? like the latter.

0 comments:

Post a Comment