linux 如何将“tail -f”与“grep”一起保存输出到另一个名称随时间变化的文件中?

jexiocij  于 2022-12-11  发布在  Linux
关注(0)|答案(1)|浏览(299)

步骤1
正如我在标题中所说的,我想将tail -f example | grep "DESIRED"的输出保存到不同的文件中
我试过了
tail -f example | grep "DESIRED" | tee -a different
tail -f example | grep "DESIRED" >> different
全部都不工作
我已经搜索了类似的问题,并阅读了几个Maven建议buffered,但我不能使用它。
我还有别的办法吗?
步骤2
一旦上面做了,我想使“不同”(文件名从上面)的时间变化。我想保持改变它的名字在每30分钟。
例如像
20221203133000
20221203140000
20221203143000
...
我试过了
tail -f example | grep "DESIRED" | tee -a $(date +%Y%m%d%H)$([ $(date +%M) -lt 30 ] && echo 00 || echo 30)00
问题是,由于我甚至没有解决第一步,我无法测试第二步。但我认为这个命令将只创建一个文件的基础上,我运行命令的时间,,,,我可以得到一些建议吗?

bqf10yzr

bqf10yzr1#

下面的代码应该做你想做的。
一些解释:当您希望bash执行一些“代码”(在您的例子中是转储到不同的文件名)时,您可能需要并行运行两件事:tail + grep以及决定转储位置的代码。
为了连接这两个进程,我使用了一个fifo名称(用mkfifo创建),其中tail + grep(使用〉tmp_fifo)写入的内容在while循环中被读取(使用〈tmp_fifo),然后在while循环中,你可以自由地输出到任何你想要的文件名。
注意:如果没有行缓冲(如您的问题)grep将工作,将等待,直到它有更多的数据(prob 8k)转储到文件。因此,如果你没有大量的数据生成的“例子”,它不会转储,直到它足够。

rm -rf tmp_fifo
mkfifo tmp_fifo

(tail -f input | grep --line-buffered TEXT_TO_CHECK > tmp_fifo &)

while read LINE < tmp_fifo; do
  CURRENT_NAME=$(date +%Y%m%d%H)
  # or any other code that determines to what file to dump ...
  echo $LINE >> ${CURRENT_NAME}
done

相关问题