Grep recherche mot exact dans fichier

Bonjour,

J’essaye de délimiter mon critère de recherche mais cela ne fonctionne pas.

Le fichier de test.txt :

------AA toto1
aaaa toto2

Mon fichier test.sh

#!/bin/bash
val="aaaa"
fichier="/etc/test.txt"

SEARCH=$(/bin/grep -i -c -w ${val} ${fichier} | cut -d ' ' -f1)

echo ${SEARCH}

=> OK

#!/bin/bash
val="------AA"
fichier="/etc/test.txt"

SEARCH=$(/bin/grep -i -c -w ${val} ${fichier} | cut -d ' ' -f1)

echo ${SEARCH}

=> ERREUR

Une idée ?

Merci

grep suppose que ------AA est une option.
Essaye de mettre un double-tiret après grep pour délimiter les options du texte à chercher:

[code]#!/bin/bash
val="------AA"
fichier="/etc/test.txt"

SEARCH=$(/bin/grep -i -c -w – ${val} ${fichier} | cut -d ’ ’ -f1)

echo ${SEARCH}[/code]

NB : Ça marche aussi avec quasiment toutes les commandes : cp, mv, ls, awk, …

1 J'aime

Bonjour,

Merci pour l’astuce, mais j’ai quand même toujours un problème pour chercher un mot exact :013

Si j’essaye de chercher la valeur "------AA@toto.fr" cela me retourne 0 (Aucune valeur)

grep -Ec -- "^------AA@toto.fr$" test.txt | cut -d ' ' -f1

Dans mon fichier test.txt la valeur est présente, je pense que le @ pose problème…

------AA@toto.fr toto1
aaaa toto2

avec awk je pense que cela doit marcher correctement :

 awk '{ if($1 == "------AA@toto.fr") print $0;}' test.txt | wc -l

Par contre dans mon script bash cela ne fonctionne pas ??

#!/bin/bash
val="------AA@toto.fr"
fichier="/etc/test.txt"

SEARCH=$(awk '{ if($1 == "${val}") print $0;}' ${fichier} | wc -l)

echo ${SEARCH}
 

Ben, si ton fichier contient la ligne suivante : ------AA@toto.fr toto1
Et tu cherches à match avec la regexp suivante :

^------AA@toto.fr$
Alors il est logique que tu ne trouves rien …

Bin si je pense !

| cut -d ' ' -f1

Rappel sur les regexp:
Le caractère “^” signifie “début de ligne”.
Le caractère “$” signifie “fin de ligne”.

Donc, “^------AA@toto.fr$” signifie : un truc qui commence par "------AA@toto.fr", et qui fini par "------AA@toto.fr", avec rien d’autre au milieu. Tu matches donc la ligne "------AA@toto.fr" exactement, ni plus ni moins.
Et donc, tu ne matches pas la ligne "------AA@toto.fr toto1" (elle commence par "------AA@toto.fr", mais ne finit pas par…

Vla;

1 J'aime

Ton expression est mauvaise utilise plutôt :

grep -Fcw -- "------AA@toto.fr" < "${fichier}" # pas besoin de wc
# ou
awk '$1=="------AA@toto.fr"{c++}END{c}' "${fichier}" # toujours pas besoin de wc

trop fort
13 ans de linux pour apprendre que ca existe youpi
merci merci

en plus, non ?!? !?!!!