无法将可用内存实用程序的 grepped 输出重定向到文件

Posted

技术标签:

【中文标题】无法将可用内存实用程序的 grepped 输出重定向到文件【英文标题】:Can't redirect grepped output of free memory utility to a file 【发布时间】:2022-01-15 13:40:57 【问题描述】:

我似乎无法将空闲内存实用程序的 grepped 输出重定向到文件。该文件为空。该命令确实会产生屏幕输出。此外,在删除管道 grep 后,它可以工作!以下是会议:

$ free -s 5 -m|grep Mem #Produces screen output
Mem:           7745         279        5645           0        1820        7185
Mem:           7745         279        5645           0        1820        7185
^C
$ free -s 5 -m|grep Mem >& mem.log
^C
$ cat mem.log #File is empty
$ ls -l mem.log #Confirming file is empty
-rw-rw-r-- 1 ubuntu ubuntu 0 Dec 10 23:59 mem.log
$ free -s 5 -m >& mem.log #Removing the grep and retrying
^C
$ cat mem.log #Now file contains the data
              total        used        free      shared  buff/cache   available
Mem:           7745         278        5645           0        1821        7186
Swap:             0           0           0

知道发生了什么吗?这是一个错误吗?

【问题讨论】:

【参考方案1】:

像大多数 C 程序一样,grep 的输出在写入终端时是行缓冲的,但如果 stdout 被重定向到文件或管道则完全缓冲。完全缓冲意味着它有一个内部缓冲区,通常为 4KB,并且仅在该缓冲区填满时才打印内容。

您可以使用grep --line-buffered 强制它使用行缓冲来解决它。此选项告诉它立即打印出匹配项。这不是默认行为,因为它比完全缓冲要慢。

更好的选择是只运行free -m 而不是free -s 5 -m,以便free 打印空闲内存并退出。当您使用-s 5 时,它会永远运行,这反过来又会导致 grep 永远运行并且永远不会刷新其输出,这就是为什么您每次都必须 Ctrl-C 的原因。删除 -s 5 和 grep 将正常工作。

【讨论】:

添加 --line-buffered 解决了这个问题 :-) 目的是让它永远运行,或者至少直到我要分析其内存使用情况的程序完成运行:-)

以上是关于无法将可用内存实用程序的 grepped 输出重定向到文件的主要内容,如果未能解决你的问题,请参考以下文章

Linux 第三天 重定负管道符环境变量

系统输入与输出

适用于 OSX 的 MySQL 工作台。没有可用的实用程序

如何通过命令行实用程序操作文本:grep、cut、awk、sed 或 BBEdit(Grep 查找选项)

将 OpenCV 构建为 deb 包:CPackDeb:文件实用程序不可用

k8s 简单实用查日志命令(最后一种内存使用低)