Как я могу подавить вывод из grep, чтобы он только возвращал статус выхода?

57

У меня есть grepкоманда. Я ищу ключевое слово в файле, но не хочу отображать совпадение. Я просто хочу знать статус выхода grep.

jackass27
источник

Ответы:

69

Любая POSIX-совместимая версияgrep имеет переключатель -qдля тишины:

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

В GNU grep (и, возможно, других) вы также можете использовать синонимы с длинными опциями:

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

пример

Строка существует:

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

Строка не существует:

$ echo "here" | grep -q "not here"
$ echo $?
1
SLM
источник
6

Просто перенаправьте вывод grepна /dev/null:

grep sample test.txt > /dev/null

echo $?
cuonglm
источник
1
Это не удастся, echo $?если grepвернет ненулевой код завершения.
Винни Никлаус
2

Вам просто нужно объединиться grep -q <pattern>с немедленной проверкой кода завершения для последнего процесса quit ( $?).

Вы можете использовать это для создания такой команды, например:

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

Вы можете при желании подавить вывод, STDERRнапример, так:

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

Это напечатает error: 2из caseоператора (при условии, что у нас нет привилегий на чтение /etc/shadowили что файл не существует), но сообщение об ошибке от grepбудет перенаправлено, /dev/nullчтобы мы никогда его не увидели.

Чарльз Бойд
источник