Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Comments on grep AND search for multiple words in files

Parent

grep AND search for multiple words in files

+9
−0

I have text (xml actually) files. Some files contain 'foo', some contain 'bar', some contain neither and some contain both. It's the both I'm interested in.

How do I do an AND search on words in files in folders (recursively) with grep? I'm using git bash in windows, so either a cygwin or win10 solution works.

I had thought pipeing to grep would work as it seems to be the solution for multiple text on a line, but I don't think I've changed it to work for files correctly.

This is what I tried:

$ grep -rnw . -e 'foo' | grep -e 'bar'

Can someone tell me how to fix my grep call?

History
Why does this post require moderator attention?
You might want to add some details to your flag.
Why should this post be closed?

0 comment threads

Post
+3
−0

An alternative to grep is Awk, which makes this pretty easy.

To find lines which contain both:

find . -type f -exec awk '/foo/ && /bar/' {} +

(Maybe add { print FILENAME ":" FNR ":" $0 } before the closing quote if you want the filename and the line number.)

To find files which contain both;

find . -type f -exec awk 'FNR==1 { foo=0; bar=0 }
  foo && bar { print FILENAME; nextfile }
  /foo/ { ++foo }
  /bar/ { ++bar }' {} +
History
Why does this post require moderator attention?
You might want to add some details to your flag.

1 comment thread

I think the "find _files_ which contain both" is the relevant part here, in particular since in case ... (2 comments)
I think the "find _files_ which contain both" is the relevant part here, in particular since in case ...
AdminBee‭ wrote 11 months ago · edited 11 months ago

I would assume the "find files which contain both" is the relevant part here, in particular since in case of structured files, it is not guaranteed that the elements (OP unfortunately doesn't give concrete examples) are on the same line ...

tripleee‭ wrote 11 months ago

The question is slightly unclear. The OP seems to want to find files where the matches can be on separate lines, but the grep example in the question would only find occurrences on the same line.