无法将可用内存实用程序的 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 输出重定向到文件的主要内容,如果未能解决你的问题,请参考以下文章
如何通过命令行实用程序操作文本:grep、cut、awk、sed 或 BBEdit(Grep 查找选项)