Dmitrijs Mihailovs
Dmitrijs Mihailovs

Reputation: 7

grep: compare string from file with another string

I have a list of files paths that I need to compare with a string:

git_root_path=$(git rev-parse --show-toplevel)
list_of_files=.git/ForGeneratingSBConfigAlert.txt
cd $git_root_path
echo "These files needs new OSB config:"
while read -r line
do
    modfied="$line"
    echo "File for compare: $modfied"
        if grep -qf  $list_of_files" $modfied"; then
            echo "Found: $modfied"
        fi
done < <(git status -s | grep -v " M" | awk '{if ($1 == "M") print $2}')

$modified - is a string variable that stores path to file

Pattern file example:

SVCS/resources/
SVCS/bus/projects/busCallout/
SVCS/bus/projects/busconverter/
SVCS/bus/projects/Resources/  (ignore .jar)
SVCS/bus/projects/Teema/
SVCS/common/
SVCS/domain/
SVCS/techutil/src/
SVCS/tech/mds/src/java/fi/vr/h/service/tech/mds/exception/
SVCS/tech/mds/src/java/fi/vr/h/service/tech/mds/interfaces/
SVCS/app/cashmgmt/src/java/fi/vr/h/service/app/cashmgmt/exception/
SVCS/app/cashmgmt/src/java/fi/vr/h/service/app/cashmgmt/interfaces/
SVCS/app/customer/src/java/fi/vr/h/service/app/customer/exception/
SVCS/app/customer/src/java/fi/vr/h/service/app/customer/interfaces/
SVCS/app/etravel/src/java/fi/vr/h/service/app/etravel/exception/
SVCS/app/etravel/src/java/fi/vr/h/service/app/etravel/interfaces/
SVCS/app/hermes/src/java/fi/vr/h/service/app/hermes/exception/
SVCS/app/hermes/src/java/fi/vr/h/service/app/hermes/interfaces/
SVCS/app/journey/src/java/fi/vr/h/service/app/journey/exception/
SVCS/app/journey/src/java/fi/vr/h/service/app/journey/interfaces/
SVCS/app/offline/src/java/fi/vr/h/service/app/offline/exception/
SVCS/app/offline/src/java/fi/vr/h/service/app/offline/interfaces/
SVCS/app/order/src/java/fi/vr/h/service/app/order/exception/
SVCS/app/order/src/java/fi/vr/h/service/app/order/interfaces/
SVCS/app/payment/src/java/fi/vr/h/service/app/payment/exception/
SVCS/app/payment/src/java/fi/vr/h/service/app/payment/interfaces/
SVCS/app/price/src/java/fi/vr/h/service/app/price/exception/
SVCS/app/price/src/java/fi/vr/h/service/app/price/interfaces/
SVCS/app/product/src/java/fi/vr/h/service/app/product/exception/
SVCS/app/product/src/java/fi/vr/h/service/app/product/interfaces/
SVCS/app/railcar/src/java/fi/vr/h/service/app/railcar/exception/
SVCS/app/railcar/src/java/fi/vr/h/service/app/railcar/interfaces/
SVCS/app/reservation/src/java/fi/vr/h/service/app/reservation/exception/
SVCS/app/reservation/src/java/fi/vr/h/service/app/reservation/interfaces/
kraken_test.txt
namaker_test.txt
shmaker_test.txt

I need to compare file search pattern with a string, is it possible using grep?

Upvotes: -1

Views: 119

Answers (2)

l0b0
l0b0

Reputation: 58798

This should work:

git status -s | grep -v " M" | awk '{if ($1 == "M") print $2}' | \
grep --file=.git/ForGeneratingSBConfigAlert.txt --fixed-strings --line-regexp
  • Piping the awk output directly to grep avoids the while loop entirely. In most cases you'll find you don't really need to print debug messages and the like in it.
  • --file takes a file with one pattern to match per line.
  • --fixed-strings avoids treating any characters in the patterns as special.
  • --line-regexp anchors the patterns so that they only match if a full line of input matches one of the patterns.

All that said, could you clarify what you are actually trying to accomplish?

Upvotes: 0

tripleee
tripleee

Reputation: 189387

I'm not sure I understand the overall logic, but a few immediate suggestions come to mind.

  • You can avoid grep | awk in the vast majority of cases.
  • A while loop with a grep on a line at a time inside the loop is an antipattern. You probably just want to run one grep on the whole input.

Your question would still benefit from an explanation of what you are actually trying to accomplish.

cd "$(git rev-parse --show-toplevel)"
git status -s | awk '!/ M/ && $1 == "M" { print $2 }' |
grep -Fxf .git/ForGeneratingSBConfigAlert.txt

I was trying to think of a way to add back your human-readable babble, but on second thought, this program is probably better without it.

The -x option to grep might be wrong, depending on what you are really hoping to accomplish.

Upvotes: 1

Related Questions