grep終了コードを取得しますが、すべての行を印刷する方法は?

grep終了コードを取得しますが、すべての行を印刷する方法は?

コマンドで印刷された行にエラーメッセージが含まれていることを確認したい(ロギングのため)、コマンドのすべての出力も印刷したいと思いますmake。得る方法はありますか?みんなコマンドの出力(未修正)とその出力に基づく終了コードは何ですか?私が考えることができる最も近い解決策はmy_command | grep -C 99999999 '^Error'

これは似ているが違う。この問題、終了コードに興味があり、色を指定したくないからです。

答え1

それを使用teeしてstderrにリダイレクトします。

my_command | tee /dev/stderr | grep -q '^Error'

終了ステータスを保存しgrep、すべての出力をコンソールに表示されるstderrにコピーします。標準出力に必要な場合は、後で次のようにリダイレクトできます。

( my_command | tee /dev/stderr | grep -q '^Error' ) 2>&1

何も出力されませんがgrep開きますtee

答え2

AWKを使用してこれを行うことができます。

command 2>&1 | awk '/^Error/{exit_code=1;}/^/ END{ exit !exit_code}'

これはすべての出力ラインを印刷し、見つかった場合は0を返しError、そうでない場合は1を返します。

答え3

あなたはこれを行うことができますsedしかも!

+をすべて印刷する機能です。強調する一致+終了コードを返す(5) 一致する項目がない場合:

search_regex()
{
  pattern=$1
  shift
  esc=$(printf "\033")
  sed '/'"${pattern}"'/,${s//'$esc'[32m&'$esc'[0m/g;b};$q5' "$@"
}

$ echo -e "どんな問題\nジョーンズ氏?" |

何ですか戻る
Jさん存在するうん?

答え4

方法は次のとおりですsed着色したくない場合、つまり正確な出力が必要な場合:

my_command | sed '/^Error/,$b;$q1'

これはやや不思議なので、どのように機能するかを説明しようとしています。

  • デフォルトでは、sedstdinからstdoutまですべての行が印刷されるため、すべての行を印刷する最初の目標を達成しました。
  • /^Error/,$/^Error/次に、パターンに一致する行からファイルの終わりまで($最後の行を意味する)までの範囲を定義します。
  • この範囲内でコマンドが実行されますbbラベルに分岐(つまりジャンプ)します。タグを省略すると、スクリプトの末尾に分岐します。sed戻りステータスコードは0です。
  • パターンに一致する行がない場合、/^Errorrange コマンドは実行されないため、スクリプトの最後に移動しません。代わりに、次のコマンドを実行してください$q1
  • $q1q1最後の行()でコマンドを実行することを意味します$q1ステータスコードでスクリプトを終了1

関連情報