2012-04-10 2 views
1

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

使用シナリオは次のとおりです。私は原則としてgawk --lint-invalidを使用してスクリプトで起こりうるエラーを検出し、偽のものを除外したい。エラーをファイルにリダイレクトする代わりに、ファイルを調べるときにそれらをgreppingする代わりに、ファイルに書き込む前にフィルタリングを実行したいと思います。

例:このスクリプトは、すべての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 

しかし、偽のゴークの警告が表示されます(これらは懸念されません)。たとえば、フィルタを使用して、

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

エラーファイルにリダイレクトするときに、そのインラインで行うことはできますか?

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

STDERRがエラーログにリダイレクトされます。この方法:エラーファイルを調べるとき は今、私はいつも

cat errors | ./filter-gawk-output.sh | less 
+0

ここでは、あなたの(間違いなく一貫した)あなたの猫の役に立たない使用について避けられないコメントがあります。 http://partmaps.org/era/unix/award.html – tripleee

+1

@トライプルーを参照してください:私はcatの使用がパイプライン入力をより明瞭にし、スクリプトに追加のパラメータを必要としないと主張することができます。もっと実用的なことに、たくさんのことをしようとすると 'cat 'でパイプラインを開始すると、grepやsedなどを簡単に追加できます – haelix

+0

' gawk'が診断をリダイレクトする方法はないと思いますstderr以外の場所に移動します。これが当てはまる場合、疑問は実際にあなたのシェル( 'bash'、' tcsh'、 'zsh'など)の一般的な構文です。 – FooF

答えて

0

何についてを行います。

+0

これは今のところうまくいきます。私の欲しいものはGAWK_ERRORS.LOGに投稿したような偽のgawkエラーを出力しないことです。私のGAWK_ERRORS.LOGには** gawk **エラーだけが含まれているのではなく、私自身がスクリプトコード(他のスクリプトなどを呼び出す)に挿入している多くの診断も含まれていることに注意してください。複雑なスクリプトを作成すると、関連するエラーメッセージだけを取得するとよいでしょう。おかげで – haelix

0

私は警告の出力を変更する機能を持つgawkを認識していません。だから私はこれがシェルの構文についてもっと疑問だと思う。あなたがしたい場合は

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

filter_warningsgawk警告をフィルタリングし、あなたのシェルとしてbashを想定したためで、我々は|&構文を使用して、パイプコマンドにstderrを指示することができます

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

考える

ファイルに出力し、かっこを使用する必要があります。

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

は、gawkプログラムの出力をstdoutに、出力2をstderrに出力します。

+0

こんにちは、ありがとう、これは正しい軌道にあるようです。しかし、私のgawk呼び出し(あなたの答えの最後の行)がスクリプトの中にあり、スクリプトがファイルのリダイレクトを行っていないと想像してください。外部の世界です。したがって、|&を使用すると、エラーは出力と混合され、両方がフィルタリングされて出力されます。 – haelix

+0

私が必要とするのは、標準出力をそのままにして、標準エラーをフィルタリングして、スクリプト内のすべてをフィルタすることです。次に、このスクリプトは正しい標準出力とフィルタされた標準エラーを持ち、呼び出し元が望むファイルにリダイレクトすることができます。それは理にかなっていますか? – haelix

関連する問題