Prashanth
Prashanth

Reputation: 1398

Issues with grep and get a count of a string in a loop

I have a set of search strings in a file (File1) and a content file (File2). I am trying to loop through all the search strings within File1 and get a count of each of the search string within File2 and output it - I want to automate this and make it generic so I can search through multiple content files. However, I dont seem to be able to get the exact count when I execute this loop. I get a "0" count for each of the strings although I have those strings in the file. Unable to figure out what I am doing wrong and can use some help !

Below is the script I came up with:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
    count=$(echo cat "$2" | grep -c "$line")
    echo "$count - $line"
done < "$1"

Command I am using to run this script:

./scanscript.sh File1.log File2.log

I say this since I searched this command separately and get the right value. This command works by itself but I want to put this in a loop

cat File2.log | grep -c "Search String"

Sample Data for File 1 (Search Strings):

/SERVER_NAME/Root/DEV/Database/NJ-CONTENT/Procs/
/SERVER_NAME3/Root/DEV/Database/NJ-CONTENT/Procs/

Sample Data for File 2 (Content File):

./SERVER_NAME/Root/DEV/Database/NJ-CONTENT/Procs/test.test_proc.sql:29:     
./SERVER_NAME2/Root/DEV/Database/NJ-CONTENT/Procs/test.test_proc.sql:100:       
./SERVER_NAME3/Root/DEV/Database/NJ-CONTENT/Procs/test.test_proc.sql:143:       
./SERVER_NAME4/Root/DEV/Database/NJ-CONTENT/Procs/test.test_proc.sql:223:       
./SERVER_NAME5/Root/DEV/Database/NJ-CONTENT/Procs/test.test_proc.sql:5589:

Upvotes: 1

Views: 205

Answers (1)

anubhava
anubhava

Reputation: 786349

Problem is this line:

count=$(echo cat "$2" | grep -c "$line")

That should be changed to:

count=$(grep -Fc "$line" "$2")

Also note -F is to be used for fixed string search instead of regex search.


Full code:

while IFS='' read -r line || [[ -n "$line" ]]; do
    count=$(grep -Fc "$line" "$2");
    echo "$count - $line";
done < "$1"

Run it as:

./scanscript.sh File1.log File2.log

Output:

1 - /SERVER_NAME/Root/DEV/Database/NJ-CONTENT/Procs/
1 - /SERVER_NAME3/Root/DEV/Database/NJ-CONTENT/Procs/

Upvotes: 1

Related Questions