2

bash コマンドの動作について質問があります。stdout から 2 つの異なるファイルに同じフラックスを 2 回 grep したい。そのために、次のことを行いました。

./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2' > file2

しかし、私のfile2は空です。私grep -i 'grep2'は何も捕まえなかったと思ったが、単に入力すると:

./prog | tee >(grep -i 'grep1' > file1) | grep -i 'grep2'

私は注意を払った結果を持っています:

[grep2] mylog...
[grep2] mylog...
[grep2] mylog...

次のコマンドを使用して、2 つのファイルに書き込むことができました。

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)

> /dev/nullしかし、標準出力に出力がないように、最後に追加する必要があります。

私の質問は、2 番目の grep の後のリダイレクトがリダイレクトによってキャッチされないのはfile2なぜですか?また、そのために別の名前付きパイプを追加する必要があるのはなぜですか?

4

2 に答える 2

2

あなたはほとんどそこにいます。これを試して:

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)

stdout 出力をスキップしたい場合は、

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2) > /dev/null

例えば:

kent$  seq 30|tee >(grep 2 >a) >(grep 3 > b) > /dev/null                                                                                                                    

kent$  head a b
==> a <==
2
12
20
21
22
23
24
25
26
27

==> b <==
3
13
23
30
于 2013-04-10T10:11:41.117 に答える
0

ケントの答えを読んで彼の例を使用したseq後、問題は私のプログラムにあることがわかりました。私のプログラムはデーモンとして動作するため、最後のリダイレクトの最後のパイプは最初のパイプとしてフォークされず、プログラムが終了するまで何もしませんでした。

したがって、2 つのリダイレクトに 2 つの名前付きパイプを使用する適切なソリューションが既にありました。

./prog | tee >(grep -i 'grep1' > file1) >(grep -i 'grep2' > file2)
于 2013-04-10T12:50:40.100 に答える