319 votes

Comment vérifier si un fichier contient une chaîne spécifique en utilisant bash

Je veux vérifier si un fichier contient une chaîne spécifique ou non en bash. J'ai utilisé ce script, mais ça ne fonctionne pas :

 if [[ 'grep 'SomeString' $File' ]];then
   Some Actions
 fi

Qu'est-ce qui ne va pas dans mon code ?

2 votes

0 votes

Voici comment récupérer la sortie d'un fichier de type command : stackoverflow.com/questions/12375722/

581voto

Igor Chubin Points 16598
 if grep -q SomeString "$File"; then
   Some Actions
 fi

Vous n'avez pas besoin [[ ]] ici. Il suffit d'exécuter la commande directement. Ajouter -q lorsque vous n'avez pas besoin de la chaîne de caractères affichée lorsqu'elle a été trouvée.

Le site grep La commande renvoie 0 ou 1 dans le code de sortie selon le résultat de la recherche. le résultat de la recherche. 0 si quelque chose a été trouvé ; 1 sinon.

$ echo hello | grep hi ; echo $?
1
$ echo hello | grep he ; echo $?
hello
0
$ echo hello | grep -q he ; echo $?
0

Vous pouvez spécifier les commandes comme une condition de if . Si la commande renvoie 0 dans son code de sortie, cela signifie que la condition est vraie ; sinon, elle est fausse.

$ if /bin/true; then echo that is true; fi
that is true
$ if /bin/false; then echo that is true; fi
$

Comme vous pouvez le voir, vous exécutez ici les programmes directement. Aucun autre [] ou [[]] .

0 votes

Plus d'informations sur grep et les options disponibles dans asnwer stackoverflow.com/a/4749368/1702557

2 votes

Pourrait envisager -Fxq paramètres comme dans stackoverflow.com/a/4749368/544721

3 votes

Envisager d'utiliser -m 1 afin d'améliorer les performances de l'analyse. Retourne à la première occurrence.

44voto

Benoit Points 35553

En plus des autres réponses, qui vous ont dit comment faire ce que vous vouliez, j'essaie d'expliquer ce qui n'allait pas (ce qui est ce que vous vouliez).

Dans Bash, if doit être suivie d'une commande. Si le code de sortie de cette commande est égal à 0, alors la commande then est exécutée, sinon la partie else si une partie est exécutée.

Vous pouvez le faire avec n'importe quelle commande comme expliqué dans d'autres réponses : if /bin/true; then ...; fi

[[ est une commande interne de bash dédiée à certains tests, comme l'existence de fichiers, les comparaisons de variables. De même, [ est une commande externe (elle est située typiquement dans /usr/bin/[ ) qui effectue à peu près les mêmes tests mais qui a besoin de ] comme argument final, c'est pourquoi ] doivent être complétés par un espace à gauche, ce qui n'est pas le cas avec ]] .

Ici, vous n'avez pas besoin [[ ni [ .

Une autre chose est la façon dont vous citez les choses. En bash, il n'y a qu'un seul cas où les paires de guillemets s'imbriquent, c'est "$(command "argument")" . Mais en 'grep 'SomeString' $File' vous n'avez qu'un seul mot, car 'grep ' est une unité citée, qui est concaténée avec SomeString puis à nouveau concaténée avec ' $File' . La variable $File n'est même pas remplacé par sa valeur en raison de l'utilisation de guillemets simples. La façon correcte de procéder est grep 'SomeString' "$File" .

10voto

lzap Points 5049

Version la plus courte (correcte) :

grep -q "something" file; [ $? -eq 0 ] && echo "yes" || echo "no"

peut également s'écrire comme suit

grep -q "something" file; test $? -eq 0 && echo "yes" || echo "no"

mais vous n'avez pas besoin de le tester explicitement dans ce cas, donc la même chose avec :

grep -q "something" file && echo "yes" || echo "no"

3 votes

if grep -q something file; then echo yes; else echo no; fi . Pas de raison de s'embêter avec $? du tout.

-1voto

madarekrap Points 1

J'ai fait ça, ça semble fonctionner correctement

if grep $SearchTerm $FileToSearch; then
   echo "$SearchTerm found OK"
else
   echo "$SearchTerm not found"
fi

1 votes

La citation est cassée et vous voulez probablement éviter de voir la sortie de l'application grep .

-1voto

paulsm4 Points 39422

Essayez ça :

if [ ! grep 'SomeString' $File ];then
   not found
else
   some actions
fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X