19

I have a String "ABCD" and a file test.txt. I want to check if the file has only this content "ABCD". Usually I get the file with "ABCD" only and I want to send email notifications when I get anything else apart from this string so I want to check for this condition. Please help!

2
  • Are you using a bash script? You can grab the contents of test.txt by doing cat test.txt and then compare with your string. Commented Aug 31, 2016 at 21:55
  • Please edit your question to show what you have tried so far. You should include a minimal reproducible example of the code that you are having problems with, then we can try to help with the specific problem. You should also read How to Ask. Commented Aug 31, 2016 at 22:12

6 Answers 6

30

Update: My original answer would unnecessarily read a large file into memory when it couldn't possibly match. Any multi-line file would fail, so you only need to read two lines at most. Instead, read the first line. If it does not match the string, or if a second read succeeds at all, regardless of what it reads, then send the e-mail.

str=ABCD
if { IFS= read -r line1 &&
     [[ $line1 != $str ]] ||
     IFS= read -r $line2
   } < test.txt; then
    # send e-mail
fi 

Just read in the entire file and compare it to the string:

str=ABCD
if [[ "$(< test.txt)" != "$str" ]]; then
    # send e-mail
fi
Sign up to request clarification or add additional context in comments.

2 Comments

Second option also allows to assert multiline text file content
I had to do if [[ "$(< test.txt)" != "$str" ]]; then to get the second option to work properly for multiline files. Note the quotes.
16

Something like this should work:

s="ABCD"
if [ "$s" == "$(cat test.txt)" ] ;then
    :
else
    echo "They don't match"
fi

1 Comment

$(...) strips trailing carriage return if it exists. Using $(...) works in limited situations. Using cmp as suggested by VasiliNovikov is not only faster, it avoids the use of $(...) which modifies the input stream.
9
str="ABCD"
content=$(cat test.txt)
if [ "$str" == "$content" ];then
    # send your email
fi

1 Comment

I think you may need to add a not to your if statement? The author sounds as if they want to send the email if the contents does not match
3
if [ "$(cat test.tx)" == ABCD ]; then
           # send your email
else
    echo "Not matched"
fi

1 Comment

$(...) strips a trailing carriage return if it exists.
3

This would be the most efficient and correct solution:

cmp -s -- ./my_file <(echo -n "$my_string")

Full example (verbose):

if cmp --silent -- ./my_file <(printf '%s' "$my_string"); do
  echo "File matches the expected string precisely"
fi

Explanation:

  • This solution will not trim newlines in the file -- useful if you want a precise test (this was commented below as well, before the edit here)
  • The cmp utility will exit early if the file is big, so you don't need to worry about that.

1 Comment

This is the answer for an exact test. $(...) and read strips trailing newlines which can cause problems.
0

Solution using grep:

    if grep -qe ^$MY_STR$ myfile; then \
        echo "success"; \
    fi

1 Comment

This matches for all files where MY_STR is a sub-string, right? Poster want to match only files where MY_STR is the entire content. ^ and $ is anchors for a line, the the entire file.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.