【问题标题】:Pipe continuous stream to multiple files通过管道将连续流传输到多个文件
【发布时间】:2012-07-12 19:40:46
【问题描述】:

我有一个程序将持续运行,将输出写入标准输出,我想不断地从中获取最后一组输出并将其写入文件。每次出现一组新的输出时,我都想覆盖同一个文件。

一个例子是下面的命令:

iostat -xkd 5

每 5 秒打印一些输出,每个输出后都有一个空行。我希望将最后一个“集合”写入文件,我认为这应该可以通过简单的方式实现。

到目前为止,我已经尝试过使用 xargs,但我只能用一行来完成此操作,而不是由某些东西分隔的一组行。

我认为 awk 可能有可能,但我不知道如何让它在数据传输过程中缓冲数据,以便它可以使用系统将其写出,或者让它关闭并重新打开相同的输出文件。

编辑:为了澄清,这是一个将连续运行的命令。我不想启动一个新命令并读取它的输出。

解决方案

我改编了@Bittrance 的答案以获得以下信息:

iostat -xkd 5 | (while read r; do
        if [ -z "$r" ]; then
                mv -f /tmp/foo.out.tmp /tmp/foo.out
        else
                echo "$r" >> /tmp/foo.out.tmp
        fi
done)

这基本上是相同的,除了检测“节”的结尾并写入临时文件以便每当外部进程尝试读取输出文件时,它就会完成。

【问题讨论】:

    标签: linux shell awk


    【解决方案1】:

    部分答案:

    ./your_command | (while read r ; do 
        if ... ; then
            rm -f foo.out
        fi
        echo $r >> foo.out
    done)
    

    如果有一个条件(...),您知道您正在接收“集合”的第一行,这将起作用。

    【讨论】:

    • 有趣的选项,我没想到会那样做。我设法调整了您的部分解决方案以获得有效的东西 - 我将发布我在问题中使用的内容
    【解决方案2】:

    为什么不:

    while :; do
      iostat -xkd > FILE
      sleep 5
    done
    

    如果您设置使用awk,则以下会将iostat 的每个输出写入编号文件:

    iostat -xkd 5 | awk -v RS=$'\n'$'\n' '{ print >NR; close(NR) }'
    

    注意:第一条记录是iostat输出的头部。

    【讨论】:

    • 这不是一回事 - 它在每个循环中再次运行程序。程序需要保持运行。
    【解决方案3】:

    编辑在回复评论时,我测试了这个 perl 解决方案的工作:

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    $|=1;
    
    open(STDOUT, '>', '/tmp/iostat.running') or die $!;
    
    while(<>)
    {
        seek (STDOUT, 0, 0) if (m/^$/gio);
        print
    }
    

    所以现在可以

    iostat -xkd 5 | myscript.pl&
    

    并观看快照:

    watch -n10 cat /tmp/iostat.running
    

    如果您想确保最后有足够的空间被覆盖(因为每次输出长度可能略有不同),您可以在最后打印一些填充,例如:

        print "***"x40 and seek (STDOUT, 0, 0) if (m/^$/gio);
    

    (剪掉旧的答案文本,因为它显然使人们感到困惑)

    【讨论】:

    • 重复运行 iostat 并在其间休眠 5 与连续运行不同。我不能让日志文件无限增长——它基本上会永远运行。
    • fifo 可能是一个有趣的选项,但我不确定如何让它工作,并且输出的长度可能会略有不同。
    • 哈。如果您愿意使用 perl,我现在已经搞定了。请参阅编辑后的答案。
    • 这似乎符合我的意图。不过,当您发布此内容时,我刚刚完成了对 bittrance 的回答。干杯!
    • 现在也通过填充解决了长度变化的问题,使想法更加健壮/完整
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2021-12-19
    • 2018-06-04
    相关资源
    最近更新 更多