Grep pas comme une expression régulière

96

J'ai besoin de rechercher une variable PHP $someVar. Cependant, Grep pense que j'essaye d'exécuter une regex et se plaint:

$ grep -ir "Something Here" * | grep $someVar
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
$ grep -ir "Something Here" * | grep "$someVar"
<<Here it returns all rows with "someVar", not only those with "$someVar">>

Je ne vois pas d'option pour dire à grep de ne pas interpréter la chaîne comme une expression régulière, mais d'inclure le $comme un autre caractère de chaîne.

dotancohen
la source
3
Dans cette question, le principal problème n'est pas d' grepinterpréter $comme une regex. Il s'agit de la substitution du shell $someVarpar la valeur de la variable d'environnement someVar, probablement la chaîne vide. Le deuxième exemple ne doit pas renvoyer toutes les lignes avec someVarmais toutes les lignes, car la chaîne vide se trouve dans toutes les lignes. Pour dire au shell de ne pas se substituer, vous devez utiliser '$someVar'ou \$someVar. Ensuite, vous devrez vous occuper de l' grepinterprétation du $personnage.
Christophe Drevet-Droguet
1
@ ChristopheDrevet-Droguet: Merci pour l'explication, j'étais perplexe quant au vote négatif! Votre commentaire est suffisamment informatif pour être une réponse, en fait, ce serait l'une des meilleures réponses sur la page si c'est le cas.
dotancohen

Réponses:

-8

Échappez au $en mettant un \devant lui.

Monsieur Lister
la source
299

Utilisez fgrep(obsolète), grep -Fou grep --fixed-strings, pour qu'il traite le modèle comme une liste de chaînes fixes, au lieu d'une expression régulière.

Pour référence, la documentation mentionne (extraits):

-F --fixed-stringsInterprétez le modèle comme une liste de chaînes fixes (au lieu d'expressions régulières), séparées par des retours à la ligne, dont chacune doit être mise en correspondance. (-F est spécifié par POSIX.)

fgrepest le même que grep -F. L'appel direct en tant que fgrep est obsolète, mais est fourni pour permettre aux applications historiques qui en dépendent de s'exécuter sans modification.

Pour la référence complète, consultez: https://www.gnu.org/savannah-checkouts/gnu/grep/manual/grep.html

Hasturkun
la source
bonne réponse simple.
breadmj
D'accord - lorsque vous utilisez des variables, vous ne pouvez pas faire quelque chose comme PHP addslashes()dans bash. C'est la manière la plus simple de le faire.
geerlingguy
1
Merci, cela a fonctionné. Rappel: si vous utilisez des guillemets doubles, vous devrez $grep -FR "unset(\$foo['bar'])"
quand
57

grep -Fest un moyen standard grepd'interpréter l'argument comme une chaîne fixe et non comme un modèle.

rkhayrov
la source
1
Sérieusement, cela aurait dû être la réponse acceptée!
ankush981
Bonne réponse. Cela a résolu mon problème lorsque je recherche une chaîne avec $ en utilisant la commande ssh. L'échappement avec "\" ne fonctionnait pas dans ce scénario. Mais -F flag a fait l'affaire.
Rajasekhar
8

Vous devez dire à grep que vous utilisez une chaîne fixe, au lieu d'un modèle, en utilisant '-F':

grep -ir "Something Here" * | grep -F \$somevar
Huelbois
la source
3

Dans cette question, le principal problème n'est pas d' grepinterpréter $comme une regex. Il s'agit de la substitution du shell $someVarpar la valeur de la variable d'environnement someVar, probablement la chaîne vide.

Donc, dans le premier exemple, c'est comme appeler grepsans aucun argument, et c'est pourquoi cela vous donne une usagesortie. Le deuxième exemple ne doit pas renvoyer toutes les lignes contenant someVarmais toutes les lignes, car la chaîne vide se trouve dans toutes les lignes.

Pour dire au shell de ne pas se substituer, vous devez utiliser '$someVar'ou \$someVar. Ensuite, vous devrez vous occuper de l'interprétation grep du $caractère, d'où l' grep -Foption donnée dans de nombreuses autres réponses.

Une réponse valable serait donc:

grep -ir "Something Here" * | grep '$someVar'
Christophe Drevet-Droguet
la source
2

+1 pour l' -Foption, ce sera la réponse acceptée. De plus, j'ai eu un comportement "étrange" lors de la recherche du -I..modèle dans mes fichiers, car l ' -Iétait considéré comme une option de grep; pour éviter ce genre d'erreurs, nous pouvons spécifier explicitement la fin des arguments de la commande en utilisant --.

Exemple:

grep -HnrF -- <pattern> <files>

J'espère que cela aidera quelqu'un.

Aloïké Go
la source
que signifie F?
Arnold Roa
Depuis gnu.org/software/grep/manual/grep.html : "-F: interprète le modèle comme une liste de chaînes fixes (au lieu d'expressions régulières), séparées par des retours à la ligne, dont chacune doit être mise en correspondance. (-F est spécifié par POSIX.) "
Aloïké Go
Si --est utilisé, peut -HnrFêtre omis?
Daniel
@Daniel Cela dépend de ce que vous voulez faire: -Févite d'interpréter le motif comme une expression régulière, tout en --évitant d'interpréter les éléments qui le suivent comme des options de grep.
Aloïké Go
@ AloïkéGo Merci, je comprends.
Daniel