将grep过滤的内容输出到文件中

1、需求

统计某个进程一段时间的CPU使用率数据。

top -b -d 1 -p 1234 | grep 1234

2、百度参考略有不同

咋一看,似乎是一个很简单的问题,就是 taif -f | grep 过滤出来的内容重定向到文件中就行了,但是为什么文件一直为空呢?

其实这要从shell的输出机制说起,因为标准输出到终端时默认行缓冲或无缓冲,重定向到硬盘之后,就变成了全缓冲。

因此 tail -f 往终端打印,和往文件中写是不一样的,往文件中写,需要先写到pipe的缓冲区中, 然后再写到文件中。tail -f 之后表示一个流还没有完成, 缓冲区不会自动写,因此导致内容无法写入文件。

解决方法呢?很简单,既然缓冲区不自动写,那我们就强制写。方法不止一种,此处我们单讲 fflush:

fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。

以上是百度百科中对fflush释义,在shell中,我们可以使用awk来调用fflush,话不多说,先上shell:

tail -f xxx.log | awk '/china|beijing/ {print $0; fflush() }' >> out.txt 此命令即实现实时过滤 xxx.log 文件中的关键词 china 或 beijing ,并将对应的行输出到out.txt文件中。 ———————————————— 版权声明:本文为CSDN博主「丰耳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/Mrheiiow/article/details/109738702

3、未找到结果

最终妥协,按笨拙的办法进行。

results matching ""

    No results matching ""