Dans bash, je veux retourner le nom du fichier (et le chemin du fichier) pour chaque fichier de type .php|.html|.jscontenant la chaîne insensible à la casse"document.cookie" | "setcookie"
cela ne semble pas fonctionner pour moi (du moins pas sur mac) .... se bloque juste ... egrep -lir --include = * "repo" egrep: avertissement: recherche récursive de stdin
Dean Hiller
13
Vous avez oublié d'ajouter le chemin à rechercher. Le chemin est «.» dans l'exemple ci-dessus. Dans votre cas, le script attend l'entrée pour rechercher sur stdin. Essayez: egrep -lir --include = * "repo" / (ou tout autre chemin)
LodeRunner
1
grep -E ... >egrep ...
Aman
J'ai eu une erreur grep: (error|fail): No such file or directorysur Ubuntu Desktop 16; des indices?
Nam G VU
Pour que cela fonctionne, je devais sauter le * avec \. so I have--include=\*.{php,html,js}
Ou peut-être utiliser l' -loption (simplement imprimer les noms de fichiers qui correspondent) au lieu de-n
glenn jackman
15
findeux et greppour la chaîne:
Cela trouvera tous les fichiers de vos 3 types dans / starting / path et grep pour l'expression régulière '(document\.cookie|setcookie)'. Divisez sur 2 lignes avec la barre oblique inverse juste pour la lisibilité ...
Comme l'utilisation universelle de find, mais à mon avis, il vaut mieux utiliser-exec grep -l 'sth' {} \;
NGix
Merci @Michael Berkowski De cette façon le plus rapide plus de 5 ou 8 fois # egrep -ir --include=file.foo "(foo|bar)" /dirsur un répertoire de poids ~ 500 Go .
Qh0stM4N
9
Sonne comme un travail parfait pour grepou peut-être ack
+1 L'utilisation -exec grep...est meilleure que ma xargsméthode car elle ne s'étouffera pas avec les espaces dans les noms de fichiers.
Michael Berkowski
@MichaelBerkowski: Vous pouvez l' utiliser comme ceci pour traiter les espaces dans les noms de fichiers: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Bien sûr, les autres options peuvent également être ajoutées.
-regextype posix-extendedindique à findquel type de regex s'attendre
-regex "^.*\.(php|html|js)$"indique à findl'expression régulière elle-même que les noms de fichiers doivent correspondre
-exec grep -EH '(document\.cookie|setcookie)' {} \;dit findd'exécuter la commande (avec ses options et arguments) spécifiée entre l' -execoption et le \;pour chaque fichier qu'il trouve, où {}représente l'emplacement du chemin du fichier dans cette commande.
tandis que
EL'option indique grepd'utiliser une expression régulière étendue (pour prendre en charge les parenthèses) et ...
HL'option indique grepd'imprimer les chemins de fichiers avant les correspondances.
Et, étant donné cela, si vous ne voulez que des chemins de fichiers, vous pouvez utiliser:
|[pipe] envoie la sortie de findà la commande suivante après ceci (qui est sed, alors sort)
roption indique sedd'utiliser une expression régulière étendue.
s/HI/BYE/dit sedde remplacer chaque première occurrence (par ligne) de "HI" par "BYE" et ...
s/(^.*):.*$/\1/lui dit de remplacer l'expression régulière (^.*):.*$(signifiant un groupe [truc entouré par ()] comprenant tout [ .*= un ou plusieurs de n'importe quel caractère] depuis le début de la ligne [ ^] jusqu'à 'le premier': 'suivi de n'importe quoi jusqu'à' la fin de line [ $]) par le premier groupe [ \1] de l'expression régulière remplacée.
uindique à sort de supprimer les entrées en double (à prendre sort -ucomme 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 aussi de donner des explications plus complètes sur certains outils que vous pourriez utiliser).
Réponses:
Le
r
drapeau signifie une recherche récursive (recherche dans les sous-répertoires). Lei
drapeau signifie insensible à la casse.Si vous voulez juste des noms de fichiers, ajoutez l' indicateur
l
(minusculesL
):la source
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
sur Ubuntu Desktop 16; des indices?--include=\*.{php,html,js}
Essayez quelque chose comme
grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
le
-i
rend insensible à la cassele
.
à la fin signifie que vous voulez commencer à partir de votre répertoire actuel, cela peut être remplacé par n'importe quel répertoire.les
-r
moyens le font de manière récursive, dans l'arborescence des répertoiresle
-n
imprime le numéro de ligne pour les correspondances.le
--include
vous permet d'ajouter des noms de fichiers, des extensions. Caractères génériques acceptésPour plus d'informations, voir: http://www.gnu.org/software/grep/
la source
-l
option (simplement imprimer les noms de fichiers qui correspondent) au lieu de-n
find
eux etgrep
pour la chaîne:Cela trouvera tous les fichiers de vos 3 types dans / starting / path et grep pour l'expression régulière
'(document\.cookie|setcookie)'
. Divisez sur 2 lignes avec la barre oblique inverse juste pour la lisibilité ...la source
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
sur un répertoire de poids ~ 500 Go .Sonne comme un travail parfait pour
grep
ou peut-être ackOu cette magnifique construction:
la source
-exec grep...
est meilleure que maxargs
méthode car elle ne s'étouffera pas avec les espaces dans les noms de fichiers.find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Bien sûr, les autres options peuvent également être ajoutées.la source
Juste pour inclure une autre alternative, vous pouvez également utiliser ceci:
find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;
Où:
-regextype posix-extended
indique àfind
quel type de regex s'attendre-regex "^.*\.(php|html|js)$"
indique àfind
l'expression régulière elle-même que les noms de fichiers doivent correspondre-exec grep -EH '(document\.cookie|setcookie)' {} \;
ditfind
d'exécuter la commande (avec ses options et arguments) spécifiée entre l'-exec
option et le\;
pour chaque fichier qu'il trouve, où{}
représente l'emplacement du chemin du fichier dans cette commande.tandis que
E
L'option indiquegrep
d'utiliser une expression régulière étendue (pour prendre en charge les parenthèses) et ...H
L'option indiquegrep
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 defind
à la commande suivante après ceci (qui estsed
, alorssort
)r
option indiquesed
d'utiliser une expression régulière étendue.s/HI/BYE/
ditsed
de remplacer chaque première occurrence (par ligne) de "HI" par "BYE" et ...s/(^.*):.*$/\1/
lui dit de remplacer l'expression régulière(^.*):.*$
(signifiant un groupe [truc entouré par()
] comprenant tout [.*
= un ou plusieurs de n'importe quel caractère] depuis le début de la ligne [^
] jusqu'à 'le premier': 'suivi de n'importe quoi jusqu'à' la fin de line [$
]) par le premier groupe [\1
] de l'expression régulière remplacée.u
indique à sort de supprimer les entrées en double (à prendresort -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 aussi de donner des explications plus complètes sur certains outils que vous pourriez utiliser).
la source