プログラムの出力をgrepして出力を正常にエコーするにはどうすればよいですか?

プログラムの出力をgrepして出力を正常にエコーするにはどうすればよいですか?

私は何かが間違っているときにエラーメッセージを印刷しますが、それに応じて終了ステータスを設定しないプログラムを使用しています。終了ステータスは常に 0 で、成功を示します。シェルスクリプトでこのプログラムを実行し、エラーメッセージが表示されたら、スクリプトがプログラムに失敗するように指示できるように、ゼロ以外の終了ステータスを取得したいと思います。

エラーメッセージは、一致が見つかったかどうかに応じて終了ステータスを一致させ設定できる予測可能なパターンに従い、grepプログラムgrepの出力をここにパイプし、grep結果を無効にして目的の!終了ステータスを取得できます。

問題は、パイプで接続するとgrepできないことです。バラよりプログラムの出力はgrep消費されたため、もはや存在しません。どういうわけか出力からエラーメッセージを検索したいのですが、エラーに加えて他の重要なメッセージがあるので、出力も正常に表示したいと思います。残念ながら、grepすべての入力、一致する行、一致しない行を渡すオプションはありません。

私が見つけた一つの方法最大作品は次のとおりです

! my_program | tee /dev/stderr | grep -q "error message"

これはプログラムの出力をstderrに入れますが、grepstderrにもコピーするので、私が見ることができるようにリダイレクトされません。私のスクリプトのstdoutとstderrの両方がターミナルに送信されても​​大丈夫です(したがって、どちらがメッセージを受け取るかは問題ではありません)。ただし、stdoutとstderrが別の場所にリダイレクトされると、メッセージが終了する可能性があります。間違った場所。

POSIXシェルとGNUツールを使用してプログラムの標準出力および/または標準エラーストリームをスキャンし、それに応じて終了ステータスを設定し、両方のストリームを通常のターゲットに到達させるbash(簡潔な)方法はありますか?grep

my_programstderrではなくstdoutにエラーメッセージを書き込むので、stdoutストリームのみをスキャンできるソリューションは理想的ではありませんが、問題ありません。違いがある場合はCentOS 7でこれを行っています。)

ベストアンサー1

...grepなどのツールを使用してプログラムのstdoutストリームおよび/またはstderrストリームをスキャンし、それに応じて終了ステータスを設定し、同時に2つのストリームを通常のターゲットに到達させる(簡潔な)方法はありますか?

...my_programは、標準エラーではなく標準出力にエラーメッセージを記録します。標準出力ストリームのみをスキャンするソリューションは問題ありません。しかし、理想的ではありません。

私の解決策は答えた。勇敢な上部です。

最も簡単な方法は次のことだと思いますawk

myprogram |
awk 'BEGIN {status = 0} /error message/ {status = 1} 1; END {exit(status)}'

このawkコマンドは、入力したすべてをそのまま出力しますが、最終的に終了する状態は、「エラーメッセージ」が入力の一部かどうかによって異なります。

簡潔なバージョン(短い変数名):

myprogram | awk 'BEGIN{s=0} /error message/{s=1} 1; END{exit(s)}'

おすすめ記事