例如在这里进行了解释:
如何剪切free
命令的输出。但我想每隔几秒钟执行一次并将其记录到文件中。所以我尝试:
free -g -s2 | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log
但文件仍为空。为什么会这样以及如何解决?
答案1
发生这种情况是因为据我所知,sed
首先缓冲输入,这意味着命令不会结束,因此它不会到达附加的部分(>>
)。要解决此问题,只需使用-u
/--unbuffered
标志sed
:
free -g -s2 | sed -u -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p' >> memory2.log
其他解决方案是使用while
循环:
while true; do free -g | sed -n 's/^Mem:\s\+[0-9]\+\s\+\([0-9]\+\)\s.\+/\1/p'; sleep 1; done >> memory2.log
希望有帮助:)
答案2
我会使用 awk 来形成一个更简单的命令。 Awk 也使用输出缓冲,但mawk
我的 Ubuntu 桌面上支持使用行缓冲的选项:
free -g -s2 | awk -W interactive '/^Mem:/ {print $2}'
(注意:在我的计算机上,通过 Debian 替代子系统awk
链接到)mawk
如果您要运行一个 shell 循环来调用,free | awk
那么它就会变成非常简单命令:
while true; do
free -g | awk '/^Mem:/ {print $2}' >> /path/to/memory2.log
sleep 2
done