将程序的输出通过管道传输到动态命名文件(包含日期)

将程序的输出通过管道传输到动态命名文件(包含日期)

我还是 Linux 新手,所以慢慢来。我已经用 Google 搜索了这么多,但还是找不到答案。

我正在运行一个输出 csv 数据的程序,并将其传输到 log.csv

我正在寻找一种方法让管道输出包含其创建的日期/时间。

现在命令看起来像这样(每天早上手动输入,在我让它工作之前还没有 crontab)

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

我正在使用| tee,因此我仍然可以看到终端上的输出以及记录文件。

那么,如何将输出传送到动态文件名?我有一个简单的 bash 脚本,它将输出文本,但我如何告诉 rtlamr | bash 脚本生成文件名?

以下是名为“log_energy.sh”的脚本,用于创建文本文件名:

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

如果你运行它./log_energy.sh,它只会输出你所期望的文本:

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

所以我的愚蠢想法是这样的(显然行不通)

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

现在我想想,也许创建一个脚本来完成所有这些工作会更简单。那么像这样吗?

#!/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;

我认为我可能刚刚回答了我自己的帖子,但我确信上面的脚本有问题。

答案1

您正在使用 bash,因此您可以使用进程和命令替换

从标题来看,我认为您可能想要将日期添加到日志文件输出的开始处,这将使用如下内容:

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

或者将日期添加到文件名将重定向到>> "$(date)-logfile"

但看起来您只想使用带有 tee 的文件名:

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

如果您以用户身份运行,那么该文件应该与您的用户创建的任何其他文件一样。

答案2

所以我想我确实回答了我自己的问题,或者更确切地说我让它工作了......程序位置错误,但这只是语义。

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;

这产生了预期的结果。如果我运行 ./log_energy.sh,我会在屏幕上获得终端输出,并且文件名与日期一起创建。

现在开始学习 crontabs!特别是如何让脚本在特定时间过期,然后重新启动。更多谷歌搜索!!!!

无论如何,谢谢你的帮助,也许有人会遇到这个问题,因为我发誓我在谷歌上搜索过这个问题却找不到答案,但现在我发现我完全是错的。

相关内容