如何通过管道将awk输出(具有周期性,连续输入)传输到输出文件?


10

我正在尝试编写一条命令,该命令将空闲命令的连续输出(每秒运行)传送到awk命令,该命令解析特定值(可用空闲内存)并将其输出到带有时间戳的文件中。这是我目前对命令的尝试:

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

或者,在经过谷歌搜索之后

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

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

Answers:


13

您必须刷新缓冲区才能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

这给了我想要的输出文件。谢谢!
马克

3

对于旧版本,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命令行标志以启用管道的非缓冲操作。


2

只是为了确保您得到的是您真正想要的,而不是您明确要求的。

如果您想知道系统上程序的可用内存,则可能更适合:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.