¿Cómo puedo suprimir la salida de grep, para que solo devuelva el estado de salida?

57

Tengo el grepcomando Estoy buscando una palabra clave de un archivo, pero no quiero mostrar la coincidencia. Solo quiero saber el estado de salida de grep.

jackass27
fuente

Respuestas:

69

Cualquier versión compatible con POSIXgrep tiene el interruptor -qpara silencio:

-q
     Quiet. Nothing shall be written to the standard output, regardless
     of matching lines. Exit with zero status if an input line is selected.

En GNU grep (y posiblemente otros) también puede usar sinónimos de opción larga:

-q, --quiet, --silent     suppress all normal output

Ejemplo

La cadena existe:

$ echo "here" | grep -q "here"
$ echo $?
0

La cadena no existe:

$ echo "here" | grep -q "not here"
$ echo $?
1
slm
fuente
6

Simplemente redirija la salida de grepa /dev/null:

grep sample test.txt > /dev/null

echo $?
Cuonglm
fuente
1
Esto fallará echo $?si grepdevuelve un código de salida distinto de cero.
WinnieNicklaus
2

Simplemente necesita combinar grep -q <pattern>con una verificación inmediata del código de salida para el último proceso para salir ( $?).

Puede usar esto para crear un comando como este, por ejemplo:

uname -a | grep -qi 'linux' ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error" ;; esac

Opcionalmente, puede suprimir la salida de esta STDERRmanera:

grep -qi 'root' /etc/shadow &> /dev/null ; case "$?" in "0") echo "match" ;; "1") echo "no match" ;; *) echo "error: $?" ;; esac

Esto se imprimirá error: 2desde la casedeclaración (suponiendo que no tengamos privilegios para leer /etc/shadowo que el archivo no exista), pero el mensaje de error de grepserá redirigido para /dev/nullque nunca lo veamos.

Charles Boyd
fuente