Faire correspondre la chaîne exacte en utilisant grep


65

J'ai un fichier texte:

deiauk 1611516 afsdf 765
minkra 18415151 asdsf 4152
linkra sfsfdsfs sdfss 4555
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4
deiauk 1611516 afsdf ddfgfgd
luktol1 4545 4 9
luktol 1

et je veux correspondre exactement deiauk. Quand je fais ça:

grep "deiauk" file.txt

J'obtiens ce résultat:

deiauk 1611516 afsdf 765
deiauk1 sdfsfdsfs 1561 51
deiauk2 115151 5454 4

mais j'ai seulement besoin de ça:

deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

Je sais qu'il y a une -woption, mais ma chaîne doit ensuite tracer toute la ligne.


4
Avez-vous réellement essayé grep -w? (Cette option est exactement dans ce but et cela fonctionne pour moi.) - Remarque: l'option -xcorrespond à toute la ligne.
Janis

"Je veux faire correspondre exactementdeiauk / " Je n'ai besoin que de ceci: deiauk 1611516 afsdf 765" - de quoi avez-vous besoin?
alex

Réponses:


129

Essayez l'un des:

grep -w "deiauk" textfile

grep "\<deiauk\>" textfile

3
Si vous avez un tiret ( - ) à la fin de la chaîne, ce script l'apportera comme résultat, ce qui n'était pas prévu.
Evis

Corrigez @Evert: les mots incluent uniquement des caractères alphanumériques, des chiffres et des traits de soulignement. Par conséquent, si vous avez des abréviations ou d'autres éléments avec un trait d'union, cela ne fonctionne pas.
ingyhere

@Cyrus J'ai appris le second en utilisant la *commande vi / vim sur les mots.
Shuva

Il ne fonctionne pas avec les personnages spéciaux org.apache.avro avroavec lesquels il a par exemple comparé org.apache.avro avro+mapred(essayé avec *)
Vishrant

12

Essayez ceci avec GNU grepet marquez les limites des mots avec \b:

grep "\bdeiauk\b" file

Sortie:

deiauk 1611516 afsdf 765

Voir: http://www.regular-expressions.info/wordboundaries.html


Merci mais pourquoi ça ne marche pas pour moi? echo "Enter login: " $vard grep -E "$\bvard\b" file.txt
user3334375

Essayezgrep "\b${vard}\b" file.txt
Cyrus

1
ne fonctionne toujours pas: /
user3334375

Vous aurez besoin de read:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Cyrus

7

Si vos grepsupports -P(PCRE), vous pouvez faire:

$ grep -P '(^|\s)\Kdeiauk(?=\s|$)' file.txt 
deiauk 1611516 afsdf 765
deiauk 1611516 afsdf ddfgfgd

4
Ceci est la seule réponse qui fonctionne avec des mots composés.
Ingyhere

5

En fonction de vos données réelles, vous pouvez rechercher le mot suivi d'un espace:

grep 'deiauk ' file.txt 

Si vous savez que cela doit être au début de la ligne, vérifiez-le:

grep '^deiauk ' file.txt 

Malheureusement, toutes les réponses autres que celle-ci sont incorrectes.
Shatu

@Shatu Merci! Voyons donc combien de temps cela prend pour que cela "bouillonne" ... Je suis curieux car j'aime ajouter des réponses à de vieilles questions ... Je pense que c'est supposé que oui, mais j'en doute. Ce serait bien pour moi, mais utile pour les lecteurs. Pour en faire un bon exemple, pourrais-je vous demander d'écrire un commentaire résumant les autres réponses manquantes?
Volker Siegel

(1) Félicitations pour avoir atteint le 10K rep. Vous avez maintenant le privilège de voir que cette réponse a déjà été donnée et qu'elle a été supprimée. (2) Il est toujours préférable de répondre à la question de la manière la plus large possible, sur la base de ce qui est dit, et de ne pas donner une réponse qui ne fonctionne que pour les données de l'échantillon. D'après les exemples de données de la question, il apparaît que les colonnes sont séparées par des espaces - mais ce n'est pas spécifié. Toutes les autres réponses fonctionneront également pour les colonnes séparées par des tabulations. (3) Vous avez évité la faille fatale de la réponse de tachomi (supprimé) en ajoutant le ^- mais toutes les autres réponses fonctionnent… (suite)
G-Man dit: "Réintégrez Monica" le

(Suite)… si la chaîne apparaît dans un champ autre que le premier. (4) En outre, toutes les autres réponses fonctionnent si "deiauk" est le dernier champ (c.-à-d. Qu'il n'y a rien après).
G-Man dit 'Réintégrez Monica' le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.