Grep usage
From raju
recursively grep all text files
grep -sir foobar --include "*.txt"
Ref:- https://stackoverflow.com/a/8684886/6305733
Exclude lines with tab
grep -vP "\t" database.tsv
Some favorite options
grep -inH --color
grep files that contain multiple words on different lines
The idea here is to list all the files containing all the keywords but not necessarily on the same line.
- Solution 1:
If git is installed
git grep -l --all-match --no-index -e word1 -e word2 -e wordN
The --no-index searches files in the current directory that is not managed by Git. So this command will work in any directory irrespective of whether it is a git repository or not.
By default the search is recursive. Use --max-depth or specify file glob to restrict it further.
Example:
git grep -l --all-match --no-index -e continuous -e discrete -e nominal -e ordinal *.txt
Ref:- https://stackoverflow.com/a/55926788/6305733
- Solution 2:
A pure grep solution
grep -lZ word1 * | xargs -0 grep -lZ word2 | xargs -0 grep -lZ word3 | xargs -0 grep -l wordN
Note:- All grep commands have the -Z flag except the last.
Scope:- The command will work even if the filenames contain spaces, newline characters etc.,
Example:- To list all the txt files that contain the words continuous, discrete, nominal, ordinal somewhere in the file.
grep -lZ continuous *txt | xargs -0 grep -lZ discrete | xargs -0 grep -lZ nominal | xargs -0 grep -l ordinal
If the filenames do not contain newline characters but contain spaces
grep -l word1 * | xargs -d '\n' grep -l word2 | xargs -d '\n' grep -l word3 | xargs -d '\n' grep -l wordN
If the filenames do not have any special characters such as as spaces, newline characters
grep -l word1 * | xargs grep -l word2 | xargs grep -l word3 | xargs grep -l wordN
multiple words
Show results from files only if they contain all the keywords but not necessarily on the same line
git grep --all-match --no-index -e string1 -e string2 -e string3 file
The --no-index searches files in the current directory that is not managed by Git. So this command will work in any directory irrespective of whether it is a git repository or not.
Ref:- https://stackoverflow.com/a/55926788/6305733
To grep for files that contain any of multiple keywords:
$ grep --color -E "word1|word2|word3" *.txt
To grep for files that contain all words:
git grep -l --all-match --no-index -e word1 -e word2 -e wordN *.txt
More details: grep for files containing words on different lines
To grep for files that contain multiple words (without any order) in one line:
$ grep word1 *.txt | grep word2 | grep word3
To grep for files that contain multiple words in one line in a given order:
$ egrep '(word1.*word2.*word3)' *
Ref:- http://xmodulo.com/how-to-grep-multiple-terms-or-strings.html
grep and view
open all files containing a keyword
$ grep keyword *.pl -l | xargs gvim -p
Exclude .git directory from grep searches
grep and xargs
grep -Z | xargs -0
This will use '\0' as the delimiter.
search tags | xargs do not break on space, grep equivalent of "find -print0"
To run xargs with '\n' as the delimiter
blahblah | xargs -d '\n' -l1