En bash, je veux renvoyer le nom du fichier (et le chemin d'accès au fichier) pour chaque fichier de type .php|.html|.js
contenant la chaîne ne respectant pas la casse "document.cookie" | "setcookie"
Comment je ferais ça?
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
L'indicateur r
signifie effectuer une recherche récursive (sous-répertoires de recherche). Le drapeau i
signifie non sensible à la casse.
Si vous voulez juste les noms de fichier, ajoutez l’indicateur l
(minuscule L
):
egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .
Essayez quelque chose comme grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
le -i
le rend insensible à la casse
le .
à la fin signifie que vous voulez commencer à partir de votre répertoire actuel, cela pourrait être remplacé par n'importe quel répertoire.
le -r
signifie le faire de manière récursive, tout au long de l'arborescence
le -n
imprime le numéro de ligne pour les correspondances.
le --include
vous permet d'ajouter des noms de fichiers, des extensions. Wildcards acceptés
Pour plus d'informations, voir: http://www.gnu.org/software/grep/
find
eux et grep
pour la chaîne:
Ceci trouvera tous les fichiers de vos 3 types dans/starting/path et grep pour l'expression régulière '(document\.cookie|setcookie)'
. Diviser sur 2 lignes avec la barre oblique inverse juste pour la lisibilité ...
find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
xargs egrep -i '(document\.cookie|setcookie)'
Cela semble être un travail parfait pour grep
ou peut-être ack
Ou cette magnifique construction:
find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'
Juste pour inclure une autre alternative, vous pouvez aussi utiliser ceci:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Où:
-regextype posix-extended
dit à find
à quel type de regex s'attendre-regex "^.*\.(php|html|js)$"
dit à find
le nom du fichier de la regex lui-même doit correspondre-exec grep -EH '(document\.cookie|setcookie)' {} \;
indique à find
d'exécuter la commande (avec ses options et arguments) spécifiée entre l'option -exec
et le \;
pour chaque fichier trouvé, où {}
représente l'emplacement où le fichier chemin va dans cette commande.
tandis que
E
indique à grep
d'utiliser les expressions rationnelles étendues (pour prendre en charge les parenthèses) et ...H
indique à grep
d'imprimer les chemins de fichiers avant les correspondances.Et, étant donné cela, si vous ne voulez que des chemins de fichiers, vous pouvez utiliser:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u
Où
|
[pipe] envoie la sortie de find
à la commande suivante (ceci est sed
, puis sort
)r
indique à sed
d'utiliser l'expression régulière étendue.s/HI/BYE/
indique à sed
de remplacer chaque première occurrence (par ligne) de "HI" par "BYE" et ...s/(^.*):.*$/\1/
lui dit de remplacer l'expression rationnelle (^.*):.*$
(ce qui signifie un groupe [élément entouré de ()
] incluant tout [.*
= un ou plusieurs caractères] de au début de la ligne [^
] jusqu'à 'le premier': 'suivi de n'importe quoi jusqu'à' la fin de la ligne [$
]) par le premier groupe [\1
] de la regex remplacée.u
indique au tri de supprimer les entrées en double (prenez sort -u
comme facultatif).... Loin d'être la manière la plus élégante. Comme je l'ai dit, mon intention est d'élargir l'éventail des possibilités (et de donner des explications plus complètes sur certains outils que vous pourriez utiliser).