如何将无限循环中接收到的数据写入文件
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=]]++
命令(如果我的解释不准确,请纠正我)读取它接收到的输入,然后删除重复的行,同时保留线也是如此。如果没有它,这个脚本将是疯狂的。
几件事:
循环不是无限的。它迭代直到 getpage
函数 returns 非零。
您希望循环每秒执行一次?在这种情况下,删除 sleep 1
之后的 &
否则它会执行得更快! &
将 sleep
进程置于后台并继续。
您正在呼叫 getpage
两次。这可能是无意的。我不确定它 returns 是什么,但你 可能 想要类似下面的东西:
while true; do
getpage
sleep 1
done | awk '!seen[[=10=]]++' | tee output.log
如果仍然不能解决问题,正如下面的评论中所指出的,可能是由于 awk
进行了缓冲。要强制 awk
在每一行之后刷新其输出缓冲区,您可以执行
awk '!seen[[=11=]]++ { print; fflush() }'
一个小问题是 awk
进程将在内存中保留每个唯一输入行的副本。随着从 getpage
.
的输出中读取更多独特的行,这将增长
有什么方法可以将在无限循环中收到的数据写入文件吗?我有一个脚本可以在我的终端中显示网页上显示的网页内容。但是我对 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=]]++
命令(如果我的解释不准确,请纠正我)读取它接收到的输入,然后删除重复的行,同时保留线也是如此。如果没有它,这个脚本将是疯狂的。
几件事:
循环不是无限的。它迭代直到
getpage
函数 returns 非零。您希望循环每秒执行一次?在这种情况下,删除
sleep 1
之后的&
否则它会执行得更快!&
将sleep
进程置于后台并继续。您正在呼叫
getpage
两次。这可能是无意的。我不确定它 returns 是什么,但你 可能 想要类似下面的东西:while true; do getpage sleep 1 done | awk '!seen[[=10=]]++' | tee output.log
如果仍然不能解决问题,正如下面的评论中所指出的,可能是由于 awk
进行了缓冲。要强制 awk
在每一行之后刷新其输出缓冲区,您可以执行
awk '!seen[[=11=]]++ { print; fflush() }'
一个小问题是 awk
进程将在内存中保留每个唯一输入行的副本。随着从 getpage
.