How can I check if 'grep' doesn't have any output?

I need to check if the recipient username is in file /etc/passwd which contains all the users in my class, but I have tried a few different combinations of if statements and grep without success. The best I could come up with is below, but I don't think it's working properly.

My logic behind it is that if the grep is null, the user is invalid.

send_email() { message= address= attachment= validuser=1 until [ "$validuser" = "0" ] do echo "Enter the email address: " read address if [ -z grep $address /etc/passwd ] then validuser=0 else validuser=1 fi echo -n "Enter the subject of the message: " read message echo "" echo "Enter the file you want to attach: " read attachment mail -s "$message" "$address"<"$attachment" done press_enter } 

6 Answers

Just do a simple if like this:

if grep -q $address /etc/passwd then echo "OK"; else echo "NOT OK"; fi 

The -q option is used here just to make grep quiet (don't output...)

4

Use getent and check for grep's exit code. Avoid using /etc/passwd. Equivalent in the shell:

getent passwd | grep -q valid_user echo $? 

Output:

0 

And:

getent passwd | grep -q invalid_user echo $? 

Output:

1 
1

Your piece of code:

if [ -z grep $address /etc/passwd ] 

You haven't saved the results of grep $address /etc/passwd in a variable. Before putting it in the if statement and then testing the variable to see if it is empty.

You can try it like this:

 check_address=`grep $address /etc/passwd` if [ -z "$check_address" ] then validuser=0 else validuser=1 fi 
0

The easiest one will be this:

cat test123 # Output: 12345678 cat test123 | grep 123 >/dev/null && echo "grep result exist" || echo "grep result doesn't exist" # Output: grep result exist cat test123 | grep 999 >/dev/null && echo "grep result exist" || echo "grep result doesn't exist" # Output: grep result doesn't exist 

The -z check is for variable strings, which your grep isn't giving. To give a value from your grep command, enclose it in $():

if [ -z $(grep $address /etc/passwd) ] 
1

My problem was that the file I was trying to grep was a binary file. On windows, the first two characters in the file were little squares. On mac, the first two characters were question marks. When I used more or less on the file, I could see it was binary and when I used diff, it responded that the "Binary files foo.log and requirements.txt differ".

I used cat to display the contents of the file, highlighted and copied the text (minus the two question marks at the top, deleted the file, created a new file with touch and then used vi to paste the text back into the new file.

After that, grep worked fine.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like