コマンドで印刷された行にエラーメッセージが含まれていることを確認したい(ロギングのため)、コマンドのすべての出力も印刷したいと思います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'
これはやや不思議なので、どのように機能するかを説明しようとしています。
- デフォルトでは、
sed
stdinからstdoutまですべての行が印刷されるため、すべての行を印刷する最初の目標を達成しました。 /^Error/,$
/^Error/
次に、パターンに一致する行からファイルの終わりまで($
最後の行を意味する)までの範囲を定義します。- この範囲内でコマンドが実行されます
b
。b
ラベルに分岐(つまりジャンプ)します。タグを省略すると、スクリプトの末尾に分岐します。sed
戻りステータスコードは0です。 - パターンに一致する行がない場合、
/^Error
range コマンドは実行されないため、スクリプトの最後に移動しません。代わりに、次のコマンドを実行してください$q1
。 $q1
q1
最後の行()でコマンドを実行することを意味します$
。q1
ステータスコードでスクリプトを終了1