Suprimir las líneas de salida de comandos que contienen una determinada cadena

Suprimir las líneas de salida de comandos que contienen una determinada cadena

Cuando ejecuto un comando arbitrario en la terminal en Linux, ¿hay alguna manera de suprimir los mensajes de salida que contienen una oración determinada?

Lo intenté

./mycommand | grep -v "I dont want to see this"

pero los mensajes seguían ahí.

Respuesta1

Quizás la parte no deseada sea parte de la salida a stderr pero a stdout.

Intentar:

./mycommand 2>&1 | grep -v "I dont want to see this"

Puede canalizar stderr y stdout a diferentes objetivos. Entonces puedes ver de dónde viene el resultado:

./mycommand > >(grep -v "No quiero ver esto" > stdout.log) 2> >(grep -v "No quiero ver esto" > stderr.log)

Respuesta2

Para agregar a la respuesta de cmks, si también desea que el código de retorno sea el de mycommandy no el de grep, puede usar pipefaile ignorar el estado de retorno de grep(para cuando no se encuentra la cadena a suprimir)

(set -o pipefail; (./mycommand  2>&1) | { grep -v "I dont want to see this" || true; })

Ejemplos:

  • (set -o pipefail; (echo "REMOVE" && false 2>&1) | { grep -v "REMOVE" || true; })

    • salida estándar: nada
    • devolver:1
  • (set -o pipefail; (echo "REMOVE" && true 2>&1) | { grep -v "REMOVE" || true; })

    • salida estándar: nada
    • devolver:0
  • (set -o pipefail; (echo "KEEP" && false 2>&1) | { grep -v "REMOVE" || true; })

    • salida estándar:KEEP
    • devolver:1
  • (set -o pipefail; (echo "KEEP" && true 2>&1) | { grep -v "REMOVE" || true; })

    • salida estándar:KEEP
    • devolver:0

información relacionada