让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
这就是tee
in 的用途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)