Cómo usar grep cuando el archivo no contiene la cadena

26

En mi script bash, estoy tratando de imprimir una línea si una determinada cadena no existe en un archivo.

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"

Así es como lo escribí si quería que la cadena existiera en el archivo, pero ¿cómo puedo cambiar esto para que imprima "el usuario no existe" si el usuario no se encuentra en el archivo / etc / passwd?

Chirag Vijay
fuente

Respuestas:

49

grepdevolverá el éxito si encuentra al menos una instancia del patrón y falla si no lo hace. Por lo tanto, puede agregar una elsecláusula si desea impresiones tanto "sí" como "no", o simplemente puede negar la ifcondición para obtener solo fallas. Un ejemplo de cada uno:

if grep -q "$user2" /etc/passwd; then
    echo "User does exist!!"
else
    echo "User does not exist!!"
fi

if ! grep -q "$user2" /etc/passwd; then
    echo "User does not exist!!"
fi
Eric Renouf
fuente
2

Una alternativa es buscar el estado de salida de grep. Por ejemplo:

grep -q "$user2" /etc/passwd
if [[ $? != 0 ]]; then
    echo "User does not exist!!"

Si grepno puede encontrar una coincidencia, se cerrará 1, así $?será 1. grepsiempre regresará 0si tiene éxito. Por lo tanto, es más seguro de usar $? != 0que $? == 1.

ssanch
fuente
Esta es realmente una forma más larga de decir lo que dijo Eric .
Jeff Schaller
Bueno, para mí la if ! grep ...declaración negativa no funcionó. Entonces esta es una alternativa.
ssanch
1

Lo resuelvo con un simple revestimiento:

for f in *.txt; do grep "tasks:" $f || echo $f; done

El comando verificará todos los archivos en el directorio con la extensión txt y escribirá la cadena de búsqueda (es decir, "tareas:") si se encuentra o el nombre del archivo.

matrik
fuente