web-dev-qa-db-fra.com

Comment trouver plusieurs chaînes dans des fichiers?

J'utilise la commande suivante pour rechercher des fichiers avec une chaîne donnée:

find /var/www/http -type f | xargs grep -iR "STRING1"

Mais comment puis-je trouver des fichiers qui incluent "STRING1" OR "STRING2" OR "STRING3")?

Ce code ne fonctionne pas:

find /var/www/http -type f | xargs grep -iR "STRING1" | xargs grep -iR "STRING2"
18
SPnova

POSIX, en utilisant grep avec -E option:

find /var/www/http -type f -exec grep -iE 'STRING1|STRING2' /dev/null {} +

Ou -e:

find /var/www/http -type f -exec grep -i -e 'STRING' -e 'STRING2' /dev/null {} +

Avec certaines implémentations, au moins sur les systèmes GNU, OSX et FreeBSD, vous pouvez échapper |:

find /var/www/http -type f -exec grep -i 'STRING1\|STRING2' /dev/null {} +
25
cuonglm

Pour faciliter la maintenance (si votre liste de chaînes à rechercher peut changer à l'avenir), je mettrais les modèles dans un fichier (par exemple, patterns.txt) et utiliserais le -f commutateur (-R n'est pas nécessaire si vous limitez find aux fichiers; -H vous donnera le nom du fichier au cas où il n'y en aurait qu'un; -F oblige grep à traiter les modèles que vous recherchez comme des chaînes, et non des expressions régulières, ce qui est généralement ce que vous voulez):

find /var/www/http -type f -exec grep -iHFf patterns.txt {} +
8
Paulo Almeida

Quel est le problème avec l'utilisation de egrep?

egrep -r 'string1|string2|string3' /var/www/http
6
user1293137