Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

I am trying to find files containing a specific word using grep. There are many files in the directory (> 500)

Command I run

$ grep 'delete' *

Output

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

These are the files that don't contain the given match. I want to suppress those lines from displaying to stdout. I know of -q switch, but that would suppress the complete output, which I don't want.

How do I do that?

share|improve this question
1  
Normally, grep should not print out file names of non-matching files. Actually, it looks like grep considers a line with the content 0 to be matching. Can you post the exact search pattern you are using? –  Adrian Lang Nov 22 '12 at 9:31
    
The complete grep cmd I used was grep 'delete' * -R, but I don't think -R is causing any issue. And yes, it normally doesn't print the non-matching ones, but not sure what's the case here... –  mtk Nov 22 '12 at 9:40
    
@step @everyone.. Strange... After seeing the edited post above. I tried grep -- 'delete' * (added --) and it worked as expected. Removing the -- is leading to the above display. –  mtk Nov 22 '12 at 11:50
    
@Stephane Indeed you are correct. I searched the dir... and there was a file with name -ci. Thanks for resolving the issue. You can post this scenario as an answer. –  mtk Nov 22 '12 at 13:29

3 Answers 3

up vote 4 down vote accepted

That's the behavior exhibited by grep -c.

Probably you have a file whose name starts with - and contains a c character and you're using GNU grep without setting the POSIXLY_CORRECT environment variable.

Use:

grep -- delete *

or better:

grep delete ./*

-- marks the end of options so that that filename will not be considered as an option (with a POSIX grep, it wouldn't since the non-option delete argument would have marked the end of options), but it wouldn't address the problem of a file called -. The grep delete ./* is more robust but has the drawback of outputting the extra ./ for matching files (though that may be considered a bonus since that helps identify file names that contain newline characters).

share|improve this answer

Using grep -l you will only get the files that contain at least one match.

Do you need information about how many matches there are in a file at all? Because the you could skip using -c which is used to count the number of matches in a file.

edit: And like warlock said using -I to suppress matches in binary files could also be a good idea.

share|improve this answer

Add

| grep -v ':0'

Not very elegant but I think will do the job.

Adding -l to your command will give you only matches but it will also suppress printing number of matches for each file.

share|improve this answer
    
-l worked. the work-around is also good. Thanks –  mtk Nov 22 '12 at 11:47
1  
the grep line should be grep -v ':0$' so only those at the end of a line are matched (however, the grep -l approach is far better as long as you don't need line counts) –  mreithub Nov 22 '12 at 12:17

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.