web-dev-qa-db-fra.com

Comment grep pour deux modèles dans plusieurs fichiers

J'ai plusieurs fichiers dans plusieurs répertoires et j'ai besoin d'une commande grep qui puisse renvoyer la sortie uniquement lorsque les deux modèles sont présents dans le fichier. Les motifs ressemblent à AccessToken et Registrationrequest. Les modèles ne sont pas dans la même ligne. AccessToken peut être sur une ligne et Registrationrequest peut être sur une autre ligne. Recherchez également la même chose de manière récursive dans tous les fichiers de tous les répertoires.

A essayé

grep -r "string1” /directory/file |  grep "string 2” 
grep -rl 'string 1' | xargs grep 'string2' -l /directory/ file
grep -e string1 -e string2 

Rien ne fonctionne

Quelqu'un peut-il aider s'il vous plait?

1
user1573232

Juste au cas où les fichiers sont très volumineux et que deux passages sur ceux-ci coûtent cher et que vous ne voulez que les noms de fichiers, utilisez find + awk:

find . -type f -exec awk 'FNR == 1 {a=0; r=0} /AccessToken/{a=1} /Registrationrequest/{r=1} a && r {print FILENAME; nextfile}' {} +
  • nous définissons deux variables de drapeau a et r lorsque les modèles correspondants ont été trouvés, effacées au début de chaque fichier (FNR == 1)
  • lorsque les deux variables sont vraies, nous imprimons le nom de fichier et passons au fichier suivant.
3
muru

La commande suivante peut imprimer lorsque le fichier correspond aux critères de recherche:

grep -Zril 'String1' | xargs -0 grep -il 'String2'

Voici un exemple:

~/tmp$ ls
Dir1  Dir2  File1  File2

cat File1
AccessToken is not here
Registrationrequest it is here

cat File2
iAccess
ByteMe Registrationrequest

J'ai copié à la fois File1 et File2 dans le Dir1 et Dir2 à des fins de test:

~/tmp$ grep -Zril 'AccessToken' | xargs -0 grep -il 'Registrationrequest'
File1
Dir2/File1
Dir1/File1

Ensuite, si vous voulez voir le contenu des fichiers, ajoutez ce qui suit à la fin de la recherche:

xargs grep -E "AccessToken|Registrationrequest"

Exemple:

~/tmp$ grep -Zril 'AccessToken' | xargs -0 grep -il 'Registrationrequest' | xargs grep -E "AccessToken|Registrationrequest"
File1:AccessToken is not here
File1:Registrationrequest it is here
Dir2/File1:AccessToken is not here
Dir2/File1:Registrationrequest it is here
Dir1/File1:AccessToken is not here
Dir1/File1:Registrationrequest it is here

J'espère que cela t'aides!

5
Terrance
grep -Erzl 'STR1.*STR2|STR2.*STR1'

où l'option -z finit par extraire les fichiers en une seule ligne.

Plus précisément:

grep -Erzl 'AccessToken.*Registrationrequest|Registrationrequest.*AccessToken'
2
user216043

Boucle while

Cela n’est peut-être pas aussi intelligent et efficace sur le plan des ressources que d’autres solutions, mais cela fonctionne:

while read -rd '' filename; do
    if grep -q "AccessToken" "$filename" && 
        grep -q "Registrationrequest" "$filename"
    then
        echo "$filename"
    fi
done < <(find . -type f -print0)
1
wjandrea