Подавлять вывод командных строк, содержащих определенную строку

Подавлять вывод командных строк, содержащих определенную строку

Когда я запускаю произвольную команду в терминале в Linux, есть ли способ подавить вывод сообщений, содержащих определенное предложение?

Я пытался

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

но сообщения все еще были там.

решение1

Возможно, нежелательная часть является частью вывода не на stderr, а на stdout.

Пытаться:

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

Вы можете перенаправить stderr и stdout на разные цели. Так вы сможете увидеть, откуда приходит вывод:

./mycommand > >(grep -v "Я не хочу это видеть" > stdout.log) 2> >(grep -v "Я не хочу это видеть" > stderr.log)

решение2

Чтобы добавить к ответу cmks, если вы также хотите, чтобы код возврата был from mycommand, а не from grep, вы можете использовать pipefailи игнорировать статус возврата from grep(когда подавляемая строка не найдена)

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

Примеры:

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

    • stdout: ничего
    • возвращаться:1
  • (set -o pipefail; (echo "REMOVE" && true 2>&1) | { grep -v "REMOVE" || true; })

    • stdout: ничего
    • возвращаться:0
  • (set -o pipefail; (echo "KEEP" && false 2>&1) | { grep -v "REMOVE" || true; })

    • стандартный вывод:KEEP
    • возвращаться:1
  • (set -o pipefail; (echo "KEEP" && true 2>&1) | { grep -v "REMOVE" || true; })

    • стандартный вывод:KEEP
    • возвращаться:0

Связанный контент