Grep pour les chaînes littérales

102

Je cherche un outil de type grep pour rechercher des chaînes purement littérales. Je recherche l'occurrence d'une ligne d'un fichier journal, dans le cadre d'une ligne dans un fichier journal séparé. Le texte de recherche peut contenir toutes sortes de caractères spéciaux regex, par exemple []().*^$-\.

Existe-t-il un utilitaire de recherche Unix qui n'utiliserait pas de regex, mais qui rechercherait simplement des occurrences littérales d'une chaîne?

Ben
la source
Je megrep demande pourquoi la question n'était pas "Puis-je rechercher des chaînes littérales?" au lieu de "Y a-t-il quelque chose comme grepça qui peut rechercher des chaînes littérales?" Les tournevis à tête plate peuvent s'adapter aux têtes de vis Philips, vous savez;)
ADTC

Réponses:

137

Vous pouvez utiliser grep pour cela, avec l'option -F.

-F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
Scott Stafford
la source
"chaînes fixes séparées par une nouvelle ligne" Comment puis-je faire cela à l'invite du terminal? Je sais que je peux créer un fichier de modèle, mais sans fichier, est-il possible de le faire à l'invite? Appuyer sur Entrée exécute évidemment la commande.
ADTC
13
Je vais répondre à ma propre question. :) Il vous suffit de fournir les multiples chaînes fixes en utilisant des répétitions de l' -eoption. Comme ceci: grep -F -e "fixed1" -e "fixed2" -e "fixed3" -e "fixed4". Aucune nouvelle ligne requise;)
ADTC
2
Non disponible sur Solaris. Au lieu de cela fgrepest utilisé.
majkinetor
2
@ADTC J'ai découvert que je devais utiliser des guillemets simples pour la chaîne recherchée ne contenant que des caractères spéciaux, sinon rien ne sera trouvé. Donc, cela n'a retourné aucun résultat: L' grep --include=\*.php -FRn -e "$$"utilisation de questions simples m'a donné le résultat souhaité:grep --include=\*.php -FRn -e '$$'
Piemol
2
Vous êtes @ADTC correct. $et quelques autres caractères sont spéciaux et ils seront remplacés par bash après avoir appuyé sur Entrée et avant grep(ou n'importe quelle commande) est exécutée. Vous pouvez dire à bash de laisser tous les caractères (sauf un guillemet simple) intacts en les mettant entre guillemets simples. Si vous avez besoin de taper un guillemet simple, faites-le comme ça'I'\''m special'
ndemou
14

C'est soit fgrepou grep -Fqui ne fera pas les expressions régulières. fgrepest identique grep -Fmais je préfère ne pas avoir à me soucier des arguments, étant intrinsèquement paresseux :-)

grep   ->  grep
fgrep  ->  grep -F  (fixed)
egrep  ->  grep -E  (extended)
rgrep  ->  grep -r  (recursive, on platforms that support it).
paxdiablo
la source
Pour GNU grep, fgrep est juste fourni comme un lien symbolique vers grep qui le fait prendre -F
Daenyth
3
egrepet fgrepne sont pas spécifiés par le standard POSIX; grep -Fet grep -E sont
Richard Hansen
4

Passer -Fà grep.

Ignacio Vazquez-Abrams
la source
3

vous pouvez également utiliser awk, car il a la capacité de trouver une chaîne fixe, ainsi que des capacités de programmation, par exemple uniquement

awk '{for(i=1;i<=NF;i++) if($i == "mystring") {print "do data manipulation here"} }' file
ghostdog74
la source
2
cat list.txt
one:hello:world
two:2:nothello

three:3:kudos

grep --color=always -F"hello

three" list.txt

production

one:hello:world
three:3:kudos
parandhaman
la source
2
Je ne suis pas d'accord. C'est une illustration utile de la façon dont cela fonctionne.
timwaagh