How to match once per file in grep? How to match once per file in grep? unix unix

How to match once per file in grep?


So, using grep, you just need the option -l, --files-with-matches.

All those answers about find, awk or shell scripts are away from the question.


I think you can just do something like

grep -ri -m1 --include '*.coffee' 're' . | head -n 2

to e.g. pick the first match from each file, and pick at most two matches total.

Note that this requires your grep to treat -m as a per-file match limit; GNU grep does do this, but BSD grep apparently treats it as a global match limit.


I would do this in awk instead.

find . -name \*.coffee -exec awk '/re/ {print FILENAME ":" $0;exit}' {} \;

If you didn't need to recurse, you could just do it with awk:

awk '/re/ {print FILENAME ":" $0;nextfile}' *.coffee

Or, if you're using a current enough bash, you can use globstar:

shopt -s globstarawk '/re/ {print FILENAME ":" $0;nextfile}' **/*.coffee