web-dev-qa-db-ja.com

どうすればgrepからの出力を抑制して、終了ステータスのみを返すことができますか?

grepコマンドがあります。ファイルからキーワードを検索していますが、一致を表示したくありません。 grepの終了ステータスを知りたいだけです。

65
jackass27

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
81
slm

grepの出力を/dev/nullにリダイレクトするだけです。

grep sample test.txt > /dev/null

echo $?
6
cuonglm

grep -q <pattern>と、終了する最後のプロセスの終了コードの即時チェック($?)を組み合わせるだけです。

これを使用して、たとえば次のようなコマンドを作成できます。

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

これにより、caseステートメントからerror: 2が出力されます(/etc/shadowを読み取る権限がないか、ファイルが存在しない場合)。ただし、grepからのエラーメッセージ/dev/nullにリダイレクトされるため、表示されません。

2
Charles Boyd

anyの出力を表示したくない場合は、stderrとstdoutの両方を/ dev/nullにリダイレクトする必要があります。他の答えは良いですが、存在しないか読めない(例:間違った許可)ファイルから読み込もうとするようなエラーを抑制しません。追加&> /dev/null(bashや他のいくつかのシェルで機能しますが、すべてではありません。>/dev/null 2>&1の方が移植性が高い可能性があるため、出力は表示されません。

$ ls thisfiledoesnotexist
ls: cannot access thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep -q foo thisfiledoesnotexist
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist >/dev/null
grep: thisfiledoesnotexist: No such file or directory
$ grep foo thisfiledoesnotexist &>/dev/null
$ echo $?
2
$ touch nopermissions
$ chmod 000 nopermissions
$ grep -q foo nopermissions
grep: nopermissions: Permission denied
$ grep foo nopermissions > /dev/null
grep: nopermissions: Permission denied
$ grep foo nopermissions &> /dev/null
$ echo $?
2
$ 

ターゲットファイルが存在し、ファイルであることをすでに確認していて、それを読み取る権限がある場合、これはそれほど重要ではありませんが、もう少し不注意で再帰的にgrepを実行したり、ワイルドカードを使用したりしている場合は、 stderrに出力が表示される可能性が高くなります。

0
drewbenn