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?

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

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.


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.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.