如何将无限循环中接收到的数据写入文件

How to write to file the data received in an infinite loop

有什么方法可以将在无限循环中收到的数据写入文件吗?我有一个脚本可以在我的终端中显示网页上显示的网页内容。但是我对 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[[=10=]]++'

请注意,这完全有效的唯一原因是 awk !x[[=12=]]++ 命令(如果我的解释不准确,请纠正我)读取它接收到的输入,然后删除重复的行,同时保留线也是如此。如果没有它,这个脚本将是疯狂的。

几件事:

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

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

  3. 您正在呼叫 getpage 两次。这可能是无意的。我不确定它 returns 是什么,但你 可能 想要类似下面的东西:

    while true; do
      getpage
      sleep 1
    done | awk '!seen[[=10=]]++' | tee output.log
    

如果仍然不能解决问题,正如下面的评论中所指出的,可能是由于 awk 进行了缓冲。要强制 awk 在每一行之后刷新其输出缓冲区,您可以执行

awk '!seen[[=11=]]++ { print; fflush() }'

一个小问题是 awk 进程将在内存中保留每个唯一输入行的副本。随着从 getpage.

的输出中读取更多独特的行,这将增长