web-dev-qa-db-fra.com

Comment tester si la chaîne existe dans le fichier avec Bash?

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.

267
Toren
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.
540
Thomas

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ère
  • q: 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.)
80
Kuf

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.

31
Luca Borrione

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.

14
imwilsonxu

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.

6
Christian737

Si j'ai bien compris votre question, cela devrait faire ce dont vous avez besoin.

  1. vous pouvez spécifier le répertoire que vous souhaitez ajouter via $ check variable
  2. si le répertoire est déjà dans la liste, le résultat est "dir déjà répertorié"
  3. si le répertoire ne figure pas encore dans la liste, il est ajouté à my_list.txt

Sur une ligne : check="/tmp/newdirectory"; [[ -n $(grep "^$check\$" my_list.txt) ]] && echo "dir already listed" || echo "$check" >> my_list.txt

5
lecodesportif
grep -E "(string)" /path/to/file || echo "no match found"

L'option -E permet à grep d'utiliser des expressions régulières 

2
David Okwii

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  
2
gordon

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  
1
Rudy

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

basé sur: https://stackoverflow.com/a/229606/3306354

0
AndrewD
grep -Fxq "String to be found" | ls -a
  • grep will vous aide à vérifier le contenu
  • ls listera tous les fichiers
0
Shinoy Shaji