2

我对我的 bash 命令的行为有疑问。我想将两次相同的通量从 stdout grep 到 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在最后添加,以便在标准输出中没有任何输出。

我的问题是,为什么第二个 grep 之后的重定向没有被我的file2重定向捕获,为什么我必须添加另一个命名管道才能这样做?

4

2 回答 2

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
于 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 回答