我想使用AWK 重定向功能到目前为止我所做的是:
$ vmstat 1 | awk ' { print $2 > "outfile" } '
*其实前面的命令awk
要复杂很多,不过是一个简化的演示。
如果我在没有重定向的情况下运行上述命令,我将在标准输出中获得所需的结果。但将其重定向到后outfile
,它仍然是空的:
$ cat outfile
$
这有什么问题吗?
TIA。
答案1
awk
缓冲其输出。如果您的 awk 实现提供了它(如 gawk、mawk 1、nawk 和 BSD awk 那样),请使用fflush()
.
fflush([file]) Flush any buffers associated with the open output file or pipe file. If file is missing or if it is the null string, then flush all open output files and pipes.
所以,这样写:
vmstat 1 | awk '{print $2 > "outfile"; fflush()}'
GNU awk 手动 I/O 部分值得fflush
一读。在那里你还会发现fflush
已被接受到下一个 POSIX 标准。
另外,请注意您可以给出应输出的样本数量vmstat
。因此,如果您只需要5
示例(例如),您可以等待 5 秒钟,直到命令终止,然后文件将包含输出:
vmstat 1 5 | awk '{print $2 > "outfile"}'
1 mawk 的语法有点不同:mawk -W interactive '{print $2 > "outfile"; fflush("")}'
。
答案2
问题出在缓冲上,可以将其禁用。
vmstat 1 | stdbuf -o0 awk '{print $2}' >> out
-o
输出流0
流将是无缓冲的
或者你可以循环vmstat
调用while
sleep 1
while true; do
vmstat | awk '{print $2}' >> output.file
sleep 1
done