如何写入以无限循环接收的数据文件

时间:2016-07-21 05:38:27

标签: bash awk infinite-loop tee

在无限循环中,是否有某种方法可以写入接收到的数据?我有一个脚本,在我的终端显示网页上显示的网页内容。但是我对tee数据的所有尝试都导致了一个空文件。我想这是因为没有退出循环,就没有机会写任何文件。但我已经阅读了无限循环用不需要的数据填充硬盘驱动器。所以看起来编写命令管道的输出似乎也是可能的。

get_page() {

    osascript -e \
    'tell application "Google_Chrome" to tell window 1 to tell active tab to execute javascript "document.body.innerText"'

}

while get_page | grep -E '[:alnum:]' 
do 
    sleep 1 & 
done < <(get_page) | awk '!x[$0]++'

请注意,这个工作的唯一原因是awk !x[$0]++命令(如果我的解释不准确,请更正我)读取它接收的输入,然后删除重复的行,同时保留行的顺序为好。如果没有这个,那么这个剧本就会疯狂。

1 个答案:

答案 0 :(得分:0)

一些事情:

  1. 循环不是无限的。它迭代直到getpage函数返回非零。

  2. 您希望循环每秒执行一次吗?在这种情况下,请删除&之后的sleep 1,否则执行速度会快得多! &sleep进程置于后台并继续。

  3. 您正在拨打getpage两次。这可能是无意的。我不确定它会返回什么,但你可能需要类似以下内容:

    while true; do
      getpage
      sleep 1
    done | awk '!seen[$0]++' | tee output.log
    
  4. 如果仍然无法解决问题,正如下面的评论中所指出的那样,由于awk进行了缓冲。要强制awk在每行之后刷新其输出缓冲区

    awk '!seen[$0]++ { print; fflush() }'
    

    这方面的一个小问题是awk进程将保留内存中每个唯一输入行的副本。随着从getpage的输出中读取更多唯一行,这将会增长。