5

プロセスがある場合は、fooによってフィルタリングされたa.outのstdoutを確認a.outできます。また、エラーとfooの両方がフィルターされていることを確認./a.out | grep fooすることもできます。./a.out 2>&1 | grep fooこのteeコマンドを使用すると、stdoutを端末と場合によってはファイル出力の両方に送信できます。しかし、それらを個別にフィルタリングする方法はありますか?のように:

./a.out | tee grep foo file.txt

しかし、何が行われるかはfile.txtfooに一致するようにフィルタリングされますが、画面に表示されるものはフィルタリングされません...または、画面に表示されるものはfooではなくbazによってフィルタリングされますか?すでにbashでそうする方法がない場合は、自分で「Tシャツ」を作成しますが、何らかの方法があると思います...

4

3 に答える 3

3

非常に簡単です。ファイルハンドルのプロセス置換を使用するだけです。

./a.out | tee >(grep foo > out.txt) | grep baz

teeまた、これは好きなだけ引数を取ることができるので、次のようなことができることにも注意してください。

./a.out | tee >(grep foo > foo.txt) >(grep bar > bar.txt) [etc]
于 2012-08-30T21:42:54.850 に答える
3

すべてを端末に表示し、出力をファイルにフィルター処理するには、次のことを試してください。

./a.out| tee /dev/tty | grep foo > file

/ procファイルシステムを備えたシステム(Linuxなど)を使用している場合は、次の方法で端末への出力をフィルタリングできます。

{ ./a.out | tee /proc/self/fd/3 | grep foo > file; } 3>&1 | grep bar

しかし、それでもおそらく一生懸命働いています。これを行うだけです:

./a.out | awk '/foo/{ print > "file" } 1' | grep bar
于 2012-08-30T20:58:04.027 に答える
2
{ { ( myCommandThatOutputsOnStdOutandStdErr; ) \
| ( awk ' ... filters stdout ... ' - ; ) >&3; } 2>&1 \
| ( awk ' ... filters stderr ... ' - ; ) >&4; } 3>&1 4>&2

これは擬似コードです。awkの宣伝文句は本物ではありませんが、独自のフィルターに置き換えることができます。アイデアは、2つの別々のフィルターがstderrとstdoutで独立して動作できるが、stdoutのstdoutでフィルター処理されていないものとstderrのstderrでフィルター処理されていないものを残すというものです。

ファイナル3>&14>&2同じくらい簡単にとのようなものになる可能性が3>my.stdoutあり4>my.stderrます。

于 2012-08-30T21:04:59.420 に答える