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?
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.
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"
.
##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
grep -q [PATTERN] [FILE] && echo $?
L'état de sortie est 0
(true) si le modèle a été trouvé; sinon blankstring.
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"
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
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.)
Essaye ça:
if [[ $(grep "SomeString" $File) ]] ; then
echo "Found"
else
echo "Not Found"
fi
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
Je l'ai fait, semble bien fonctionner
if grep $SearchTerm $FileToSearch; then
echo "$SearchTerm found OK"
else
echo "$SearchTerm not found"
fi