J'ai un fichier qui contient les noms de répertoire:
my_list.txt
:
/tmp
/var/tmp
J'aimerais vérifier dans Bash avant d'ajouter un nom de répertoire si ce nom existe déjà dans le fichier.
grep -Fxq "$FILENAME" my_list.txt
L'état de sortie est 0 (vrai) si le nom a été trouvé, 1 (faux) sinon, alors:
if grep -Fxq "$FILENAME" my_list.txt
then
# code if found
else
# code if not found
fi
Voici les sections pertinentes de la page de manuel relative à grep
:
grep [options] PATTERN [FILE...]
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by new-
lines, any of which is to be matched.
-x, --line-regexp
Select only those matches that exactly match the whole line.
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit immedi-
ately with zero status if any match is found, even if an error
was detected. Also see the -s or --no-messages option.
Concernant la solution suivante:
grep -Fxq "$FILENAME" my_list.txt
Si vous vous demandez (comme je l'ai fait) ce que -Fxq
signifie en clair:
F
: affecte la façon dont PATTERN est interprété (chaîne fixe au lieu d'un regex)x
: Correspond à la ligne entièreq
: Shhhhh ... impression minimaleÀ 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.)
Trois méthodes dans mon esprit:
1) Court test pour un nom dans un chemin (je ne suis pas sûr que cela puisse être votre cas)
ls -a "path" | grep "name"
2) Test court pour une chaîne dans un fichier
grep -R "string" "filepath"
3) Plus long script bash utilisant regex:
#!/bin/bash
declare file="content.txt"
declare regex="\s+string\s+"
declare file_content=$( cat "${file}" )
if [[ " $file_content " =~ $regex ]] # please note the space before and after the file content
then
echo "found"
else
echo "not found"
fi
exit
Cela devrait être plus rapide si vous avez pour tester plusieurs chaînes sur un fichier contenu en utilisant une boucle, par exemple en changeant la regex à n'importe quel cycle.
Manière plus simple:
if grep "$filename" my_list.txt > /dev/null
then
... found
else
... not found
fi
Astuce: envoyez à /dev/null
si vous voulez le statut de sortie de la commande, mais pas les sorties.
Le moyen le plus simple et le plus simple serait:
isInFile=$(cat file.txt | grep -c "string")
if [ $isInFile -eq 0 ]; then
#string not contained in file
else
#string is in file at least once
fi
grep -c renverra le nombre de fois où la chaîne apparaît dans le fichier.
Si j'ai bien compris votre question, cela devrait faire ce dont vous avez besoin.
Sur une ligne : check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt
grep -E "(string)" /path/to/file || echo "no match found"
L'option -E permet à grep d'utiliser des expressions régulières
Si vous voulez juste vérifier l'existence d'une ligne, vous n'avez pas besoin de créer un fichier. Par exemple.,
if grep -xq "LINE_TO_BE_MATCHED" FILE_TO_LOOK_IN ; then
# code for if it exists
else
# code for if it does not exist
fi
Ma version utilisant fgrep
FOUND=`fgrep -c "FOUND" $VALIDATION_FILE`
if [ $FOUND -eq 0 ]; then
echo "Not able to find"
else
echo "able to find"
fi
Une solution sans grep, fonctionne pour moi:
MY_LIST=$( cat /path/to/my_list.txt )
if [[ "${MY_LIST}" == *"${NEW_DIRECTORY_NAME}"* ]]; then
echo "It's there!"
else
echo "its not there"
fi
grep -Fxq "String to be found" | ls -a