Jai 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 veulent correspondre exactement à deiauk
. Quand je fais ceci:
grep "deiauk" file.txt
Jobtiens ce résultat:
deiauk 1611516 afsdf 765 deiauk1 sdfsfdsfs 1561 51 deiauk2 115151 5454 4
mais je seulement besoin de ceci:
deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Je sais quil y a loption « sa -w
, mais ma chaîne doit alors être entière ligne.
Commentaires
Réponse
Essayez lun des éléments suivants:
grep -w "deiauk" textfile grep "\<deiauk\>" textfile
Commentaires
- Si vous avez un tiret ( – ) à la fin de la chaîne ce script lapportera comme résultat, ce qui nétait pas prévu.
- Corriger @Eve rt: Les mots nincluent que des caractères alpha, des chiffres et des traits de soulignement, donc si vous avez des abréviations ou dautres éléments coupés, cela ne fonctionne pas.
- @Cyrus Jai appris le second en utilisant vi / vim
*
commande sur les mots. - Elle ne fonctionne pour aucun caractère spécial quelle a par exemple
org.apache.avro avro
greped avecorg.apache.avro avro+mapred
(essayé avec *) - Utilisez
-wE
pour correspondance de plusieurs mots (OU booléen)
Réponse
Essayez ceci avec GNU grep
et marquez les limites des mots avec \b
:
grep "\bdeiauk\b" file
Résultat:
deiauk 1611516 afsdf 765
Voir: http://www.regular-expressions.info/wordboundaries.html
Commentaires
- Merci mais pourquoi cela ne fonctionne pas pour moi?
echo "Enter login: " $vard
grep -E "$\bvard\b" file.txt
- Essayez
grep "\b${vard}\b" file.txt
- ' ne fonctionne toujours pas: /
- Vous ' aurez besoin de
read
:read -p "Enter login: " vard; grep "\b${vard}\b" file.txt
Réponse
Si votre grep
prend en charge -P
(PCRE), vous pouvez faire:
$ grep -P "(^|\s)\Kdeiauk(?=\s|$)" file.txt deiauk 1611516 afsdf 765 deiauk 1611516 afsdf ddfgfgd
Commentaires
- Cest la seule réponse qui fonctionne avec des mots avec trait dunion.
- Pourquoi
\K
( PCRE réinitialisation du début du match) nécessaire? Cette solution proposée semble très bien fonctionner sans elle.
Réponse
En fonction de vos données réelles, vous pouvez recherchez le mot suivi dun espace:
grep "deiauk " file.txt
Si vous savez quil doit être au début de la ligne, vérifiez-le:
grep "^deiauk " file.txt
Commentaires
- Malheureusement, toutes les réponses autres que celles-ci sont incorrectes.
- @Shatu Merci! Laissez donc ' voir combien de temps il lui faut pour " remonter en haut " … Je ' suis curieux car jaime ajouter des réponses à de vieilles questions … Je pense que cest supposé que oui, mais jen doute. Ce serait juste bien pour moi, mais en fait utile pour les lecteurs. Pour en faire un bon exemple, puis-je vous demander décrire un commentaire résumant ce que les autres réponses manquent?
- (1) Félicitations pour avoir atteint 10K rep. Vous avez maintenant le privilège de voir que cette réponse a été donnée auparavant et a été supprimée. (2) Il est toujours préférable de répondre à la question de manière aussi large que possible, en fonction de ce qui est dit, et de ne pas donner une réponse qui fonctionne uniquement pour les exemples de données. Il ressort des exemples de données de la question que les colonnes sont séparées par des espaces, mais cela 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 dans la réponse (supprimée) de tachomi en ajoutant
^
– mais toutes les autres réponses fonctionnent… (suite) - ( Suite)… si la chaîne apparaît dans un champ autre que le premier. (4) De plus, toutes les autres réponses fonctionnent si «deiauk» est le dernier champ (cest-à-dire quil ny a rien après).
Réponse
Jai trouvé que -x
fonctionnait pour moi.
Exemple
$ grep -inx -d skip "favicon.ico" * test.txt:1:favicon.ico
Manuel Grep
-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
Commentaires
- Pour 1: 1 correspondant à toute la ligne contenant des tirets,
-x
la seule option. Par exemple,grep -w "abc" <<<"abc-hac101-bb0"
correspondra, maisgrep -x "abc" <<<"abc-hac101-bb0"
ne le sera pas
grep -w
? (Cette option est exactement dans ce but , et cela fonctionne pour moi.) – Remarque: loption-x
correspond à toute la ligne.deiauk
/ " Jai seulement besoin de ceci:deiauk 1611516 afsdf 765
" – de quoi avez-vous besoin?