redireciona um arquivo gerado por um programa para outro programa

3

No ambiente linux, eu tenho um programa que cria um arquivo grande (2-3GB). Eu preciso filtrar esse arquivo (por exemplo, eu quero remover uma linha se ela aparecer nas 10 linhas precedentes). Eu quero fazer isso enquanto o programa está rodando e sem criar um novo arquivo.

Se o programa direcionou a saída para stdout em vez de um arquivo, ele poderia ser facilmente resolvido pela tubulação (arquivo prgram1 | filter_program >). Mas este não é o caso.

Existe uma maneira de fazer isso?

    
por ronstudy1 13.10.2014 / 09:21

1 resposta

2

mkfifo

Você pode ter seu primeiro programa escrito em um fifo (named pipe) em vez de um arquivo regular, então você pode processar a saída como quiser, como em um pipe normal:

mkfifo out
prgram1 -O out | filter_program < out  > file
rm out

Por exemplo, com wget como prgram1, você poderia fazer:

wget -qO out 'superuser.com' | grep '<title>' out

O | serve apenas para executar os dois comandos simultaneamente, o canal em si não é usado.

O programa deve estar gravando o arquivo sequencialmente para que isso funcione. Se precisar mover o arquivo que não serve.

Editar: Isso não funciona se o programa excluir o arquivo de saída antes de gravar.

Precisamos de mais alguns truques então. Que tal deixar o programa escrever, mas não apagar o arquivo :

$ prg1() { rm out; wget -qO out 'superuser.com'; }
$ mkfifo out
$ chmod 500 .
$ prg1 | grep '<title>' out

Isso deve funcionar desde que o programa não seja muito exigente e não contenha erros de exclusão.

    
por 15.10.2014 / 20:00

Tags