unix 如何根据grep命令将程序的stdout拆分为两个(多个)流?[已关闭]

hyrbngr7  于 2023-10-18  发布在  Unix
关注(0)|答案(3)|浏览(156)

已关闭,此问题需要更focused。它目前不接受回答。
**想改善这个问题吗?**更新问题,使其只关注editing this post的一个问题。

22天前关闭
社区在21天前审查了是否重新打开这个问题,并将其关闭:
原始关闭原因未解决
Improve this question
我有一个程序,可以将不同的表格数据格式(列数和列类型)转储到stdout;理想情况下,我希望只运行一次程序,并将stdout拆分为多个流,这样我就可以直接从流中读取CSV,而无需尝试同质化表格数据或多次运行程序。

rn0zuynd

rn0zuynd1#

对于少量的输出,可以使用支持/dev/fd/#的awk来代替grep:

dump_program |
awk '
    /regex1/ { print > "/dev/fd/1" }
    /regex2/ { print > "/dev/fd/2" }
    /regex3/ { print > "/dev/fd/3" }
    # ...
' \
    1> >( process1 ) \
    2> >( process2 ) \
    3> >( process3 ) \
;
rjee0c15

rjee0c152#

这是@jhnc的优秀答案的变体。它避免了显式操作文件描述符和使用'/dev/fd':

dump_program |
    awk '
        BEGIN {psfile1=ARGV[1]; psfile2=ARGV[2]; psfile3=ARGV[3]; delete ARGV}
        /regex1/ { print > psfile1 }
        /regex2/ { print > psfile2 }
        /regex3/ { print > psfile3 }
    ' >(process1) >(process2) >(process3)
dwthyt8l

dwthyt8l3#

您可以使用此构造:

myprog | tee >( grep COND1 > out1) >( grep COND2 > out2) | grep COND3 > out3

COND*是grep条件,out*是输出文件。

相关问题