如何将输出匹配模式的一部分通过管道传输到文件中,而将其余部分留给标准输出?

如何将输出匹配模式的一部分通过管道传输到文件中,而将其余部分留给标准输出?

a.out成为向标准输出生成大量消息的程序,例如:

$ ./a.out

A: abc
B: xyz
A: aaa
A: bbb
B: zzz
C: fff
...

我需要的是将输出区分为单独的文件,一个应该包含A:带有前缀的行,第二个应该包含B:等等,将与标准输出不匹配任何模式的行留下。

当然,可以重定向 , 的整个输出a.out,然后grep对其进行 ing。但如果输出文件将使用大量磁盘空间,则可能没有足够的空间来存储grep结果。

最好有一些partial-redirect可以在这种情况下使用的命令,如下所示:

./a.out | partial-redirect ^A: a.txt | partial-redirect ^B: b.txt | partial-redirect ^C: c.txt > rest.txt

这样的命令是否存在并且常见,或者您应该自己实现一些东西来解决这个任务?

答案1

awk -F':' '$1 ~ "[AB]" { print > $1 } $1 !~ "[AB]" { print > "otheroutput" } ' input

或者,对于一般情况,将根据第一个字段拆分整个输入:

awk -F':' '{ print > $1 }' input

正在使用:

$ cat input
A: abc
B: xyz
A: aaa
A: bbb
B: zzz
C: fff
$ awk -F':' '$1 ~ "[AB]" { print > $1.txt } $1 !~ "[AB]" { print > "otheroutput" } ' input
$ cat A
A: abc
A: aaa
A: bbb
$ cat B
B: xyz
B: zzz
$ cat otheroutput
C: fff

答案2

这就是teein 的用途bash

./a.out | tee >(grep A >fileA) | tee >(grep B >fileB) | grep C >fileC

甚至更简单zsh

./a.out > >(grep A >fileA) > >(grep B >fileB) > >(grep C >fileC)

相关内容