1 votes

Grep ne trouve pas la séquence après l'assignation à une variable

Je cours :

awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ',' | grep "*)>nS4XkrlH  @XUL"

et la séquence est située dans les résultats.

Ensuite, je cours

b=`awk -F ',' '{print $2}' data.dat | sort | uniq |  tr '\n' ','`
echo $b | grep "*)>nS4XkrlH  @XUL"

mais aucun résultat n'est renvoyé.

Quelqu'un a-t-il une idée de la raison pour laquelle cela se produit ?

Merci pour toute aide.

0voto

John1024 Points 15663

La différence essentielle entre ces deux séquences de commande est que la seconde contient echo $b qui exécute Shell division des mots . Pour que la deuxième séquence de commande s'exécute de la même manière que la première, remplacez :

echo $b | grep "*)>nS4XkrlH  @XUL"

avec :

echo "$b" | grep "*)>nS4XkrlH  @XUL"

Séparation des mots

Observez comment les espaces sont traités dans ces deux echo déclarations :

$ b="a   b c"
$ echo "$b"
a   b c
$ echo $b
a b c

Sans les doubles guillemets, le Shell effectue un découpage des mots sur les arguments à echo . Cela signifie que tous les espaces blancs consécutifs sont condensés en un seul espace. Avec les guillemets doubles, le fractionnement des mots est supprimé et les espaces blancs sont préservés.

Le fractionnement des mots et un grep Motif avec espaces multiples

Votre grep contient deux espaces consécutifs. À moins que l'argument de echo est entre guillemets, la sortie de echo ne comportera pas ces deux espaces et aucune correspondance ne sera trouvée. Observez :

$ b="*)>nS4XkrlH  @XUL"
$ echo $b | grep "*)>nS4XkrlH  @XUL"
$ echo "$b" | grep "*)>nS4XkrlH  @XUL"
*)>nS4XkrlH  @XUL

Le premier grep ne correspond à rien, mais le second oui. La différence est le fractionnement des mots du Shell.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X