Saída de tubulação do programa para um arquivo nomeado dinâmico (contém data)

1

Eu ainda sou um novato de linux de alimentação de garrafa, então vá fácil. Eu pesquisei até aqui, mas não consegui encontrar a resposta.

Estou executando um programa que gera dados csv e canaliza para log.csv

Estou procurando uma maneira de ter a saída canalizada contendo a data / hora em que ela foi criada.

Neste exato momento, o comando se parece com isso (chave de mão todas as manhãs, sem crontab até que eu consiga este trabalho)

rtlamr -format=csv -msgtype=scm | tee /home/jonboy545/energy/logs/3-16-18_7_30.csv

Estou usando | tee , então ainda posso ver a saída no terminal, bem como registrar o arquivo.

Então, como canalizar a saída para um nome de arquivo dinâmico? Eu tenho um script bash simples que irá produzir texto, mas como eu digo rtlamr para | um script bash para gerar um nome de arquivo?

Aqui está o script chamado "log_energy.sh" para criar o nome do arquivo de texto:

#!/bin/bash
today='date '+%m_%d__%H_%M_%S'';
filename="/home/jonboy545/energy/logs/$today.csv"
echo $filename;

Se você executar ./log_energy.sh , ele exibirá o texto como esperado:

/home/jonboy545/energy/logs/03_16__17_30_39.csv

Então meu pensamento estúpido é algo assim (o que obviamente não funciona)

rtlamr -format=csv -msgtype=scm | tee /home/jonboy545/./log_energy.sh

Agora que penso nisso, pode ser mais fácil criar um script que faça tudo isso. Então, algo assim?

#!/bin/bash
today='date '+%m_%d__%H_%M_%S'';
filename="/home/jonboy545/energy/logs/$today.txt"
/usr/bin/rtlamr -format=csv -msgtype=scm | tee $filename;

Pensando que posso ter acabado de responder meu próprio post, mas tenho certeza de que o script acima tem algo errado com ele.

    
por poor_red_neck 16.03.2018 / 22:36

2 respostas

0

Você está usando o bash para usar process & substituição de comando .

A partir do título, pensei que você poderia querer adicionar a data ao início da saída do arquivo de log, o que usaria algo assim:

$ program |while read pong; do echo $pong; echo $(date):\ $pong >> logfile; done

Ou adicionar a data ao nome do arquivo seria redirecionar para >> "$(date)-logfile"

Mas parece que você só quer usar o nome do arquivo com tee:

rtlamr -format=csv -msgtype=scm | tee "$(date '+%m_%d__%H_%M_%S')"

Se você estiver executando como usuário, o arquivo deverá ser igual a qualquer outro arquivo criado pelo usuário.

    
por 17.03.2018 / 05:34
0

Então eu acho que respondi a minha própria pergunta, ou melhor, eu consegui que funcionasse ... a localização do programa estava errada, mas isso é apenas semântica.

log_energy.sh:

#!/bin/bash
today='date '+%m_%d__%H_%M_%S'';
filename="/home/jonboy545/energy/logs/$today.txt"
/home/jonboy545/GoCode/bin/rtlamr -format=plain -msgtype=scm | tee $filename;

Isso produz os resultados esperados. Se eu executar ./log_energy.sh, obtenho a saída do terminal na tela e o nome do arquivo é criado com a data.

Off para aprender sobre crontabs agora! Especificamente, como ter um script expira em um determinado momento e, em seguida, inicie novamente. Mais googling !!!!

Obrigado pela ajuda de qualquer forma, TALVEZ alguém vai se deparar com isso desde que eu juro que eu pesquisei o sh * t fora disso e não consegui encontrar uma resposta, mas agora vejo que eu estava pensando tudo errado.

    
por 16.03.2018 / 23:38