2012-07-02 9 views

Respuesta

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

No necesita [[ ]] aquí. Simplemente ejecute el comando directamente. Agregue la opción -q cuando no necesite la cadena que se muestra cuando se encontró.

El comando grep devuelve 0 o 1 en el código de salida dependiendo de como resultado de la búsqueda. 0 si se encontró algo; 1 de lo contrario.

$ echo hello | grep hi ; echo $? 
1 
$ echo hello | grep he ; echo $? 
hello 
0 
$ echo hello | grep -q he ; echo $? 
0 

Puede especificar comandos como condición de if. Si el comando devuelve 0 en su código de salida, significa que la condición es verdadera; de lo contrario falso.

$ if /bin/true; then echo that is true; fi 
that is true 
$ if /bin/false; then echo that is true; fi 
$ 

Como puede ver, ejecuta aquí los programas directamente. No adicional [] o [[]].

+1

Gracias Querido Igor, Muy buena respuesta y completa ... Aprendí mucho de esta publicación. – Hakim

+0

Más información sobre 'grep' y las opciones disponibles en asnwer http://stackoverflow.com/a/4749368/1702557 – Pawel

+1

es posible que desee considerar los parámetros' -Fxq' como en http://stackoverflow.com/a/4749368/544721 –

-1
grep -q "something" file 
[[ !? -eq 0 ]] && echo "yes" || echo "no" 
+1

Tiene un error tipográfico -! se supone que es $? – lzap

+0

... no solo tiene la intención de ser '$?', Sino que no lo necesita en absoluto; puede hacer 'grep -q ...' –

+0

Además, 'foo && truthy_action || falsey_action' no es un verdadero operador ternario: si 'truthy_action' falla, entonces' falsey_action' se ejecuta _in addition_. –

0

más corta (correcto) versión:

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

puede también escribirse como

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

pero ya no tienes que probar de forma explícita en este caso, por lo que la misma con:

grep -q "something" file && echo "yes" || echo "no" 
+0

'si grep -q algo archivo; luego echo sí; else echo no; fi'. No hay razón para meterse con '$?' En absoluto. –

0

Hice esto, parece funcionar bien

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

Además de otras respuestas, que te dijeron cómo hacer lo que quería, que tratan de explicar lo que estaba mal (que es lo que quería.

En Bash, if debe seguirse con un comando. Si el código de salida de este comando es igual a 0, se ejecuta la parte then, de lo contrario se ejecuta la parte else, si hay alguna.

se puede hacer eso con cualquier comando como se ha explicado en otras respuestas: if /bin/true; then ...; fi

[[ es un comando interno fiesta dedicada a algunas pruebas, como la existencia de archivo, las comparaciones de variables. De manera similar, [ es un comando externo (se encuentra típicamente en /usr/bin/[) que realiza aproximadamente las mismas pruebas pero necesita ] como argumento final, por lo que ] debe rellenarse con un espacio a la izquierda, que no es el caso con ]].

Aquí no necesita [[ ni [.

Otra cosa es la forma en que citas cosas. En bash, solo hay un caso donde anidan pares de comillas, es "$(command "argument")".Pero en 'grep 'SomeString' $File' tiene una sola palabra, porque 'grep ' es una unidad entre comillas, que se concatena con SomeString y luego se vuelve a concatenar con ' $File'. La variable $File ni siquiera se reemplaza con su valor debido al uso de comillas simples. La forma correcta de hacerlo es grep 'SomeString' "$File".

7
##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 
+0

Cambiar el directorio no suele ser una buena idea (y aquí es completamente innecesario, simplemente califique el nombre del archivo con el directorio de destino). Y luego, lo que tienes es exactamente lo mismo que la respuesta aceptada, solo que con menos detalles. – Mat

+0

Gracias por el asesoramiento Mat –

1
if grep -q [string] [filename] 
then 
    [whatever action] 
fi 

Ejemplo

if grep -q 'my cat is in a tree' /tmp/cat.txt 
then 
    mkdir cat 
fi 
3
grep -q [PATTERN] [FILE] && echo $? 

El estado de salida es 0 (true) si se encontró el patrón;

0

En caso de que quiera checkif la cadena coincide con toda la línea y si es una cadena fija, puede hacerlo de esta manera

grep -Fxq [String] [filePath] 

ejemplo

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 

Desde el archivo de hombre:

-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.) 
0

Prueba esto:

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