无法使用 AWK 重定向

无法使用 AWK 重定向

我想使用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调用whilesleep 1

while true; do 
     vmstat | awk '{print $2}' >> output.file
     sleep 1
done

相关内容