2011-01-20 8 views

risposta

454
grep -Fxq "$FILENAME" my_list.txt 

Lo stato di uscita è 0 (vero) se è stato trovato il nome, 1 (falso) se non, in modo da:

if grep -Fxq "$FILENAME" my_list.txt 
then 
    # code if found 
else 
    # code if not found 
fi 

Qui ci sono le sezioni pertinenti the man page for 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. 
+1

Se eseguo questo comando dallo script di bash come catturare 0 o 1 in una variabile? – Toren

+3

@Toren È possibile accedere allo stato di uscita più recente usando '$?'. puoi anche usare il comando grep accanto all'istruzione 'if' (come mostrato nella risposta aggiornata). –

+0

Aggiornato con qualcosa che si spera sia più vicino al marchio. – Thomas

5

Se ho capito bene la tua domanda, questo dovrebbe fare quello che ti serve.

  1. Puoi specificare la directory che si desidera aggiungere fino a $ assegno variabile
  2. se la directory è già presente nell'elenco, l'uscita è "dir già elencato"
  3. se la directory non è ancora in la lista, si è aggiunto a my_list.txt

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

+0

Non è necessario testare l'output di grep, puoi semplicemente usare 'grep -q' e chiamare grep direttamente da' if' come fa Thomas nella sua risposta. Inoltre, la domanda non includeva il controllo dell'esistenza della directory prima di aggiungerla alla lista (potrebbe essere una lista di directory cancellate, dopo tutto). – Sorpigal

+0

Ho rimosso lo script di esempio, non ha aggiunto nulla alla risposta fornita da Thomas. – lecodesportif

22

Tre metodi nella mia mente :

1) Test breve per un nome in un percorso (non sono sicuro che questo potrebbe essere il vostro caso)

ls -a "path" | grep "name" 


2) Test breve per una stringa in un file

grep -R "string" "filepath" 


3) Longer script bash usando espressioni regolari:

#!/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 

Questo dovrebbe essere più veloce se si dispone di per testare più stringhe su un file con il contenuto utilizzando un ciclo, ad esempio cambiando l'espressione regolare in qualsiasi ciclo.

+2

Perché gli spazi sono necessari prima e dopo $ file_contenet? – EminezArtus

73

Per quanto riguarda la seguente soluzione:

grep -Fxq "$FILENAME" my_list.txt 

Nel caso vi state chiedendo (come ho fatto io) che cosa -Fxq significa in parole povere F influisce sul modo PATTERN viene interpretato (stringa fissa invece di una regex), x partita tutta la linea, q shhhhh ...minimal stampa

Dal file uomo:

-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

-F non influenza l'elaborazione del file, influisce sul modo in cui PATTERN viene interpretato. Tipicamente, PATTERN è interpretato come un'espressione regolare, ma con -F verrà interpretato come una stringa fissa. –

+0

Grazie per il tuo commento, errore corretto. – Kuf

14

Più semplice modo:

if grep "$filename" my_list.txt > /dev/null 
then 
    ... found 
else 
    ... not found 
fi 

Suggerimento: invia a /dev/null se si desidera che lo stato di uscita del comando, ma non uscite.

-1
if grep -q "$Filename$" my_list.txt 
    then 
    echo "exist" 
else 
    echo "not exist" 
fi 
1

Se si desidera verificare l'esistenza di una riga, non è necessario creare un file. Ad esempio,

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 
1

La mia versione utilizzando fgrep

FOUND=`fgrep -c "FOUND" $VALIDATION_FILE` 
    if [ $FOUND -eq 0 ]; then 
    echo "Not able to find" 
    else 
    echo "able to find"  
    fi 
+0

Non vedo l'opzione '-c' in' fgrep --help' –

+0

Anche se funziona e adoro la soluzione migliore –

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

-E opzione utilizza le espressioni regolari grep

0

Una soluzione grep-meno, funziona per me:

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 

basato su: https://stackoverflow.com/a/229606/3306354

1

Senso più facile e più semplice sarebbe:

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 restituirà il conteggio di quante volte si verifica la stringa nel file.

Problemi correlati