Stopping grep after one match in a for loop


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Stopping grep after one match in a for loop
# 1  
Old 09-20-2011
Debian Stopping grep after one match in a for loop

(apologies in advance if this one is incredibly obvious to anyone out there, i've been Smilie at this one for some time now)

What I've got is a newline-separated list of filenames to search the contents of around 2,000 XML files for, and return the name of that file. This seems like a job for a "for" loop, so I enter this on the command line:

Code:
for i in `cat ~/targets.txt`; do grep -l -m 1 $i *.xml; done

The problem here is that one of my target filenames might appear in more than one file - I only want grep to return the very first match in the very first file that it finds, and then stop and move on to the next iteration of the loop. (Which is what I was attempting to do with -m 1)

Any ideas here?

Last edited by Karunamon; 09-20-2011 at 06:46 PM..
# 2  
Old 09-20-2011
That's a useless use of backticks and useless use of cat, not just inefficient but potentially harmful -- if the file is too large it may silently return less data than is really in the file.

This construct has none of those limits:
Code:
while read LINE
do
       ...
done < filename

Since you have -m 1, you have GNU grep, which supports -F and -f, so a loop isn't actually necessary:

Code:
grep -m 1 -f targets.txt *.xml

If targets.txt contains fixed strings and not regexes, add -F before -f.

---------- Post updated at 02:30 PM ---------- Previous update was at 02:29 PM ----------

...and if all you care about is the filename and not what precisely is matching, -l will work instead of -m 1.
These 2 Users Gave Thanks to Corona688 For This Post:
# 3  
Old 09-20-2011
Code:
while IFS= read -r; do
  grep -Fl "$REPLY" *.xml |
    head -n 1 
done < ~/targets.txt 

Edit: Yep, Corona688 is right Smilie (-m1 removed)

Last edited by radoulov; 09-20-2011 at 06:42 PM..
This User Gave Thanks to radoulov For This Post:
# 4  
Old 09-20-2011
Huh! I didn't know about those gotchas with cat and the backticks (they call out exactly what I was doing there as very very wrong), so thanks for that Smilie

Unfortunately this didn't solve my problem though. It's still returning more than one file for each line in my targets.txt

Code:
grep -l -Ff targets.txt *.xml

Radoulov's script did though! I never would have thought about using a while loop in that way. It seems I have much to learn still. Thanks!!

Last edited by Karunamon; 09-20-2011 at 06:46 PM..
# 5  
Old 09-20-2011
Code:
#!/usr/bin/ksh
while read mString; do
  echo "Now searching for <${mString}>"
  for mFName in *.xml; do
    echo "Now searching on file <$mFName>"
    mCnt=$(grep -c ${mString} ${mFName})
    if [[ ${mCnt} -ne 0 ]]; then
      echo "Found <${mString}> on file <${mFName}>"
      break
    fi
  done
done < Strings_File

# 6  
Old 09-20-2011
Quote:
Originally Posted by Karunamon
Huh! I didn't know about those gotchas with cat and the backticks (they call out exactly what I was doing there as very very wrong), so thanks for that Smilie

Unfortunately this didn't solve my problem though. It's still returning more than one file for each line in my targets.txt
I got it exactly backwards, I think Smilie It doesn't return more than one match per file, but might return more than one file per match!

You do have to use a loop for that, which other people obviously have covered already.
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Grep match a mask

Hi all, Im trying to use grep to match a exact mask where some characters are known and some are not. for example: j***n@email.com in this case the length is known and the position of the unknown characters are know (and will be ) any idea how I can do this? the file list is not just... (3 Replies)
Discussion started by: flamer
3 Replies

2. UNIX for Dummies Questions & Answers

Grep Files with and without match

Hi There, How do i finding files with match and without match Normally, I will use grep -l 'Hello' grep -L 'Hello World' How do we combined (2 Replies)
Discussion started by: alvinoo
2 Replies

3. Shell Programming and Scripting

Need help on grep for particular match

Hi, Need help on grep for a particular match. cat testfile xx.xx.xx.xx:/share4 /nfsshare15 nfs defaults yes no xx.xx.xx.xx:/share5 /nfsshare15/sharedir1 nfs defaults 0 0 xx.xx.xx.xx:/share6 /nfsshare15/sharedir2 nfs defaults 0 0 Scenario... (6 Replies)
Discussion started by: sumanthupar
6 Replies

4. Shell Programming and Scripting

Grep exact match

Hello! I have 2 files named tacs.tmp and tacDB.txt tacs.tmp looks like this 0 10235647 102700 106800 107200 1105700 tacDB.txt looks like this 100100,Mitsubishi,G410,Handheld,,0,0,0 100200,Siemens,A53,Handheld,,0,0,0 100300,Sony Ericsson,TBD (AAB-1880030-BV),Handheld,,0,0,0... (2 Replies)
Discussion started by: Cludgie
2 Replies

5. Shell Programming and Scripting

grep match two lines

Hello everyone!I have a problem with grep function in unix.I have two files.One like this one:File1(Code)>100_10_50 >100_10_56>10_45_345and the other one like this:File2(Code more... (1 Reply)
Discussion started by: giuliano
1 Replies

6. Shell Programming and Scripting

Reverse match in grep

root@localhost# echo 'server $serviceName -connectorType $connectorType -ipAddress $ipAddress -port $port -domain $domain' | cut -d "-" -f 1 O/P= server $serviceName when i grep the o/p -v nothing is displayed now how to output the all data by excluding the O/P (server $serviceName) from the... (5 Replies)
Discussion started by: kalyankalyan
5 Replies

7. Solaris

grep exact match

Hi This time I'm trying to grep for an exact match e.g cat.dog.horse.cow.bird.pig horse.dog.pig pig.cat.horse.dog horse dog dog pig.dog pig.dog.bird how do I grep for dog only so that a wc -l would result 2 in above case. Thanks in advance ---------- Post updated at 06:33 AM... (4 Replies)
Discussion started by: rob171171
4 Replies

8. Shell Programming and Scripting

Need help to grep for a title match and then make some queries after the match

Here is the sample of my file address.txt Address 1 1234 Drive way New Orleans, LA Zipcode :- 12345 Address 2 4567 Spring way Chicago, IL Zipcode :- 67890 I would like to grep for an Address title (Ex :- Address 2) , then get its zipcode and echo both in a single line. Ex :- ... (3 Replies)
Discussion started by: leo.maveriick
3 Replies

9. UNIX for Advanced & Expert Users

Exact Match thru grep ?????

hey..... i do have text where the contents are like as follows, FILE_TYPE_NUM_01=FILE_TYPE=01|FILE_DESC=Periodic|FILE_SCHDL_TYPE=Daily|FILE_SCHDL=|FILE_SCHDL_TIME=9:00am|RESULTS=B FILE_TYPE_NUM_02=FILE_TYPE=02|FILE_DESC=NCTO|FILE_SCHDL_TYPE=Daily|FILE_SCHDL=|FILE_SCHDL_TIME=9:00am|RESULTS=M... (2 Replies)
Discussion started by: manas_ranjan
2 Replies

10. UNIX for Dummies Questions & Answers

how to use pattern match with grep

hi, i'm having problem like this. i wish to grep some keyword from certain files in one directory. let's say i have a lot of files in my directory with the name of file.1 file.2 file.3 ...... file.500 i only wish to grep the keyword from file.20, file.21, file.23 .... file.50 i tried... (5 Replies)
Discussion started by: rei
5 Replies
Login or Register to Ask a Question