web-dev-qa-db-fra.com

Grep peut renvoyer true / false ou existe-t-il des méthodes alternatives

Dans le cadre de ce script, je dois pouvoir vérifier si le premier argument donné correspond au premier mot du fichier. Si c'est le cas, quittez avec un message d'erreur; si ce n'est pas le cas, ajoutez les arguments au fichier. Je comprends comment écrire l'instruction if, mais pas comment utiliser grep dans un script. Je comprends que grep ressemblera à ceci

grep ^$1 schemas.txt

Je pense que cela devrait être beaucoup plus facile que je ne le fais.

J'obtiens une erreur "trop ​​d'arguments" sur l'instruction if. Je me suis débarrassé de l'espace entre grep -q, puis un opérateur binaire d'erreur est attendu.

if [ grep -q ^$1 schemas.txt ]
then
        echo "Schema already exists. Please try again"
        exit 1
else
        echo "$@" >> schemas.txt
fi
142
Lauren

grep renvoie un code de sortie différent s'il a trouvé quelque chose (zéro) vs s'il n'a rien trouvé (non nul). Dans une instruction if, un code de sortie zéro est mappé sur "true" et un code de sortie non nul est mappé sur false. De plus, grep a un -q argument pour ne pas sortir le texte correspondant (mais renvoyer uniquement le code d'état de sortie)

Donc, vous pouvez utiliser grep comme ceci:

if grep -q PATTERN file.txt; then
    echo found
else
    echo not found
fi

En bref, lorsque vous faites quelque chose comme if [ -z "$var" ]…, il se trouve que [ est en fait une commande que vous exécutez, tout comme grep. Sur mon système, c'est /usr/bin/[. (Eh bien, techniquement, votre Shell l'a probablement intégré, mais c'est une optimisation. Il se comporte comme s'il s'agissait d'une commande). Cela fonctionne de la même manière, [ renvoie un code de sortie nul pour true, un code de sortie non nul pour false. (test est la même chose que [, à l'exception de la fermeture ])

205
derobert

Un autre moyen simple consiste à utiliser grep -c.

Cela renvoie (pas de retour en tant que code de sortie), le nombre de lignes qui correspondent au modèle, donc 0 s'il n'y a pas de correspondance ou 1 ou plus s'il y a une correspondance.

Donc, si vous vouliez vérifier que le motif correspond 3 fois ou plus, vous feriez:

if [ "$(grep -c "^$1" schemas.txt)" -ge 3 ]; then
  ...
54
amigal

Je sais que je suis en retard pour cela, mais j'aime cette version courte:

grep -q ^$1 schemas.txt && echo "Schema already exists. Please try again" || echo "$@" >> schemas.txt
7
Denis Pitzalis

Try () au lieu de [], fonctionnera. Même si vous n'utilisez pas de crochets, le code fonctionnera.

0
Ankit

Si nous voulons attraper le premier mot d'un fichier, nous devons ajouter -zw à grep

if grep -qzw "^$1" file
then 
   ... 
else 
   ... 
fi

Sans pour autant -z nous obtenons le premier mot d'une ligne. Sans pour autant -w nous obtenons des mots partiels.

0
JJoao