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?
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}' {} +
a
et r
lorsque les modèles correspondants ont été trouvés, effacées au début de chaque fichier (FNR == 1
)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!
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'
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)