1

ファイルにリダイレクトされる前に stdout (または stderr) をフィルタリングする方法はありますか? 「パイプへのリダイレクト」はおそらく最良の方法ではありませんが、その効果で何かを達成する最も簡単な方法を探しています。

利用シーンは以下の通りです。私は原則として gawk --lint-invalid を使用して、スクリプトで発生する可能性のあるエラーを検出し、誤ったエラーを除外したいと考えています。ファイルを調べるときにエラーをファイルにリダイレクトして grep する代わりに、ファイルに書き込む前にフィルタリングを実行したいと考えています。

例: このスクリプトは、2 行ごとに stderr に出力します。

echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid 'BEGIN {b = 1;} // {if (b) print; else print > "/dev/stderr"; b = !b;}' 1>/dev/null 2>errors
cat errors | less

gawk: warning: regexp constant `//' looks like a C++ comment, but is not
b
d
gawk: (FILENAME=- FNR=4) warning: no explicit close of file `/dev/stderr' provided

しかし、偽の gawk 警告が表示されます (これらは問題ではありません)。たとえば、次を使用してフィルタリングできます。

filter-gawk-output.sh
---------------------
grep -Ev 'looks like a|explicit close'

エラーファイルにリダイレクトするときにインラインで行うエレガントな方法はありますか? 今、エラーファイルを調べるとき、私はいつもそうしています

cat errors | ./filter-gawk-output.sh | less
4

2 に答える 2

0

gawk警告の出力を変更する機能があることを認識していません。したがって、これはシェル構文に関する質問だと思います。

与えられた

filter_warnings() { grep -v '^gawk:'; }
awkprog='BEGIN {b = 1;} // {if (b) print; else print > "/dev/stderr"; b = !b;}'

whereは警告をfilter_warnings除外するためのものであり、シェルとして想定すると、次の構文を使用してパイプ コマンドを指示できます。gawkbashstderr|&

echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" |& filter_warnings

ファイルに出力する場合は、括弧を使用する必要があります。

(echo -ne 'a\nb\nc\nd\n' | gawk --lint=invalid "$awkprog" > output.1) |& filter_warnings > output.2

ここには へのプログラム出力 と output.2へのプログラム出力output.1が含まれます。gawkstdoutstderr

于 2012-12-24T11:09:15.680 に答える
0

どうですか:

gawk --lint=invalid 'whatever' INPUTFILE 2> GAWK_ERRORS.LOG 

この方法STDERRでエラー ログにリダイレクトされます。

于 2012-04-10T12:21:03.677 に答える