J'ai ceux-ci:
$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123
Je voulais trouver une correspondance exacte de ABB.log.
Mais quand je l'ai fait
$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123
il les montre tous.
Puis-je obtenir ce que je voulais en utilisant grep?
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Depuis la page de manuel grep:
la source
-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:
la source
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:
Une simple boucle while-read dans le shell le ferait implicitement:
la source
de même avec awk
la source
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:
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 (
.
):Tester:
Remarque:
-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$
.EDIT: (Ajout d'explications supplémentaires en ce qui concerne @hakre):
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:
la source
-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 avecgrep
")-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:
la source
la source
Fonctionne pour moi :
\b
indique / fixe des limites.Semble fonctionner assez vite
la source
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
la source
Je préfèrerais:
à votre santé
la source
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:
la source
\W
est satisfait, qui est un caractère non blanc, doncxABBxlog
.