如何将 awk 输出(带有定期、连续的输入)传输到输出文件?

如何将 awk 输出(带有定期、连续的输入)传输到输出文件?

我正在尝试编写一个命令,通过管道传输自由的命令(每秒运行一次)转换为 awk 命令,该命令解析特定值(可用空闲内存)并将其输出到带有时间戳的文件。以下是我当前尝试执行的命令:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 }' >>memOut

或者,在谷歌搜索后

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4 >>"memOut"}'

每次运行都会生成空文件。有什么建议或可能的其他方法吗?

答案1

您必须刷新缓冲区才能memOut在执行过程中看到某些内容:

free -mto -s 1 | awk '/Mem/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

以下是另一个版本:

while sleep 1; do sed -n "s/MemFree: */`date`, /p" /proc/meminfo; done >> memOut

答案2

对于旧版本,awk您可能必须使用system("")

实际上,fflush(stdout)仅适用于awk和的最新版本gawk,因为它自 2012 年 12 月起才符合 POSIX 标准。

free -mto -s 1 | awk '/Mem/ { 
    print strftime("%r") "," $4;
    system(""); # Flush output
}' >> memOut

注意使用system("")刷新每个文件描述符,其详细描述gawk在手册中,“9.1.4 输入/输出功能”一节中。

答案3

在某些版本awk(例如 mawk 1.3.3)中,您需要添加-W interactive命令行标志以启用管道的非缓冲操作。

答案4

只是为了确保你得到你真正想要的东西而不是您具体询问的。

如果您想知道系统中可用于程序的内存,那么这可能更合适:

free -m -s 1 | awk '/buffers\/cache/ { print strftime("%r") "," $4; fflush(stdout) }' >> memOut

内存行的已用列包括缓存和缓冲区,在大多数情况下,当您想要监视给定计算机/任务的内存使用情况时,至少应该注意这些。

相关内容