Réponses:
Spécifiez simplement les ancres de l'expression rationnelle.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Depuis la page de manuel grep:
-F, --fixed-strings
Interpréter PATTERN comme une (liste de) chaînes fixes
-x, --line-regexp
Sélectionnez uniquement les correspondances qui correspondent exactement à la ligne entière.
-F
? êtes-vous sur Solaris? Si c'est le cas, utilisez/usr/xpg4/bin/grep
grep
dans un script bash et cette option est meilleure que d'utiliser une expression régulière comme suggéré dans la réponse acceptée. Parce que j'ai un caractère spécial dans la variable que je recherche (comme .
) et que je n'ai pas à les échapper lors de l'utilisation de la commande.
Voici ce que je fais, mais utiliser des ancres est le meilleur moyen:
grep -w "ABB.log " a.tmp
ABB.log
, ce qui n'est pas le cas général, c'est-à-dire qu'il échouera la plupart du temps.
La plupart des suggestions échoueront s'il n'y a qu'un seul espace de début ou de fin, ce qui serait important si le fichier est édité à la main. Cela le rendrait moins sensible dans ce cas:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Une simple boucle while-read dans le shell le ferait implicitement:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
de même avec awk
awk '/^ABB\.log$/' file
J'ai l'intention d'ajouter quelques explications supplémentaires concernant les tentatives d'OP et d'autres réponses également.
Vous pouvez également utiliser la solution de John Kugelmans comme ceci:
grep -x "ABB\.log" a.tmp
citer la chaîne et échapper le point ( .
) fait qu'il n'a plus besoin du -F
drapeau.
Vous devez échapper le .
(point) (car il correspond à n'importe quel caractère (pas seulement .
) s'il n'est pas échappé) ou utiliser l' -F
indicateur avec grep.-F
flag en fait une chaîne fixe (pas une expression régulière).
Si vous ne citez pas la chaîne, vous aurez peut-être besoin d'une double barre oblique inverse pour échapper au point ( .
):
grep -x ABB\\.log a.tmp
$ echo "ABBElog"|grep -x ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x "ABB\.log"
#returns empty string, no match
-x
forces pour correspondre à toute la ligne..
sans-F
indicateur sont fausses.-x
basculement en enveloppant votre chaîne de motif avec ^
et $
. Dans ce cas, assurez-vous de ne pas utiliser -F
, mais échappez à la place .
, car -F
cela empêchera l'interprétation regex de ^
et $
.Si vous souhaitez faire correspondre une chaîne commençant par -
, vous devez utiliser --
avec grep. Tout ce qui suit --
sera considéré comme une entrée (pas une option).
Exemple:
echo -f |grep -- "-f" # where grep "-f" will show error
echo -f |grep -F -- "-f" # whre grep -F "-f" will show error
grep "pat" -- "-file" # grep "pat" "-file" won't work. -file is the filename
-F
ne sera pas nécessaire si le .
est correctement échappé.
-F
disponible lorsque vous avez écrit ceci? Sinon, quel système utilisiez-vous? Je n'ai pas trouvé cette information dans votre réponse jusqu'à présent, ce qui est encore le cas lorsque je la relis. Alors vraiment sûr, j'ai lu votre réponse complètement au moins deux fois. ;)
-F
était disponible. (J'ai dit: "ou utiliser un -F
drapeau avec grep
")
-F
est la réponse, pourquoi s'embêter à s'échapper? Quelle est votre opinion à ce sujet?
Cela a bien fonctionné pour moi lorsque j'ai essayé de faire quelque chose de similaire:
grep -F ABB.log a.tmp
$ cat venky
ABB.log
ABB.log.122
ABB.log.123
$ cat venky | grep "ABB.log" | grep -v "ABB.log\."
ABB.log
$
$ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
ABB.log.122
$
Fonctionne pour moi :
grep "\bsearch_word\b" text_file > output.txt
\b
indique / fixe des limites.
Semble fonctionner assez vite
search_word
des limites de mots séparées. Par exemple, il correspondrait à la ligne "foo search_word bar".
C'est avec HPUX, si le contenu des fichiers a un espace entre les mots, utilisez ceci:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
Je préfèrerais:
str="ABB.log"; grep -E "^${str}$" a.tmp
à votre santé
ABBxlog
J'avais besoin de cette fonctionnalité, mais je voulais aussi m'assurer de ne pas renvoyer de lignes avec un préfixe avant ABB.log:
grep "\WABB.log$" -w a.tmp
\W
est satisfait, qui est un caractère non blanc, donc xABBxlog
.