Como canalizar parte do padrão de correspondência de saída para o arquivo, deixando o restante para stdout?

1

Seja a.out o programa que produz muitas mensagens para stdout, por exemplo:

$ ./a.out

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

O que eu preciso é distinguir a saída em arquivos separados, um deve conter linhas com A: prefixo, segundo com B: e então tudo, deixando as linhas que não correspondem a nenhum padrão para stdout.

É claro que é possível redirecionar toda a saída de a.out e, em seguida, grep it. Mas se o arquivo de saída usar muito espaço em disco, pode não haver espaço suficiente para grep result.

Seria bom ter um comando partial-redirect que pode ser usado nesse caso assim:

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

Esse comando existe e é comum, ou você deve implementar algo para resolver essa tarefa?

    
por Anton K 17.07.2017 / 19:40

2 respostas

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

Ou, para um caso geral, que dividirá toda a entrada com base no primeiro campo:

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

Em uso:

$ 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
    
por 17.07.2017 / 19:56
1

É para isso que tee é em bash :

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

ou ainda mais simples em zsh :

./a.out > >(grep A >fileA) > >(grep B >fileB) > >(grep C >fileC)
    
por 17.07.2017 / 20:04

Tags