关于使用命名管道,grep和文件重定向的重定向行为

时间:2013-04-10 09:55:48

标签: bash grep io-redirection tee

我对我的bash命令的行为有疑问。我想从stdout到2个不同的文件两次相同的通量。为此,我做了:

./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...

我设法使用此命令在我的两个文件中写入:

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

但我必须在最后添加> /dev/null,以便在stdout中没有任何输出。

我的问题是,为什么第二个grep之后的重定向不会被我的file2重定向捕获,为什么我必须添加另一个命名管道呢?

2 个答案:

答案 0 :(得分:2)

你快到了。试试这个:

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

如果你想跳过标准输出,请执行

./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

答案 1 :(得分:0)

在阅读肯特的答案并使用seq使用他的例子后,我发现问题是我的程序。 我的程序表现为一个守护程序,因此最后一次重定向的最后一个管道没有作为第一个分叉,所以在程序结束之前没有做任何事情。

所以我已经有了正确的解决方案,使用2个命名管道进行2次重定向:

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