web-dev-qa-db-fra.com

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 marche pas:

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

Quel est le problème dans mon code?

219
Hakim
if grep -q SomeString "$File"; then
  Some Actions # SomeString was found
fi

Vous n'avez pas besoin de [[ ]] ici. Il suffit de lancer la commande directement. Ajoutez l'option -q lorsque vous n'avez pas besoin de la chaîne affichée lorsqu'elle a été trouvée.

La commande grep renvoie 0 ou 1 dans le code de sortie en fonction du 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 des commandes en tant que condition de if. Si la commande renvoie 0 dans son code de sortie, cela signifie que la condition est vraie. sinon faux.

$ 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 lancez directement les programmes ici. Pas de [] ni [[]] supplémentaire.

404
Igor Chubin

En plus d’autres réponses, qui vous expliquent comment faire ce que vous voulez, j’essaie d’expliquer ce qui ne va pas (c’est ce que vous vouliez.

Dans Bash, if doit être suivi d'une commande. Si le code de sortie de cette commande est égal à 0, la partie then est exécutée, sinon la partie else, le cas échéant, 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 bash dédiée à certains tests, tels que l'existence de fichiers, la comparaison de variables. De même, [ est une commande externe (située généralement dans /usr/bin/[) qui effectue à peu près les mêmes tests mais qui nécessite ] comme argument final. C'est pourquoi ] doit être complété avec un espace à gauche, ce qui n’est pas le cas avec ]].

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

Une autre chose est la façon dont vous citez les choses. Dans bash, il n'y a qu'un seul cas où des paires de guillemets sont imbriquées, c'est "$(command "argument")". Mais dans 'grep 'SomeString' $File' vous n'avez qu'un mot, parce que 'grep ' est une unité entre guillemets, qui est concaténée avec SomeString puis à nouveau concaténée avec ' $File'. La variable $File n'est même pas remplacée par sa valeur en raison de l'utilisation de guillemets simples. La bonne façon de faire est grep 'SomeString' "$File".

31
Benoit
##To check for a particular  string in a file

cd PATH_TO_YOUR_DIRECTORY #Changing directory to your working directory
File=YOUR_FILENAME  
if grep -q STRING_YOU_ARE_CHECKING_FOR "$File"; ##note the space after the string you are searching for
then
echo "Hooray!!It's available"
else
echo "Oops!!Not available"
fi
9
Nevin Raj Victor
grep -q [PATTERN] [FILE] && echo $?

L'état de sortie est 0 (true) si le modèle a été trouvé; sinon blankstring.

5
SupermanKelly

Version la plus courte (correcte):

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

peut être aussi écrit comme

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"
5
lzap
if grep -q [string] [filename]
then
    [whatever action]
fi

Exemple

if grep -q 'my cat is in a tree' /tmp/cat.txt
then
    mkdir cat
fi
3
user5854766

Si vous voulez vérifier si la chaîne correspond à toute la ligne et si c'est une chaîne fixe, vous pouvez le faire de cette façon

grep -Fxq [String] [filePath]

exemple

 searchString="Hello World"
 file="./test.log"
 if grep -Fxq "$searchString" $file
    then
            echo "String found in $file"
    else
            echo "String not found in $file"
 fi

À partir du fichier man:

-F, --fixed-strings

          Interpret  PATTERN  as  a  list of fixed strings, separated by newlines, any of 

which is to be matched.
          (-F is specified by POSIX.)
-x, --line-regexp
          Select only those matches that exactly match the whole line.  (-x is specified by 

POSIX.)
-q, --quiet, --silent
          Quiet; do not write anything to standard output.  Exit immediately with zero 

status  if  any  match  is
          found,  even  if  an error was detected.  Also see the -s or --no-messages 

option.  (-q is specified by
          POSIX.)
3
Shubham Khatri

Essaye ça:

if [[ $(grep "SomeString" $File) ]] ; then
   echo "Found"
else
   echo "Not Found"
fi
1
vgokul129

Si vous voulez vérifier si le fichier contient pas contient une chaîne spécifique, procédez comme suit.

if ! grep -q SomeString "$File"; then
  Some Actions # SomeString was not found
fi
0
Lahiru Chandima

Je l'ai fait, semble bien fonctionner

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