我想从top
捕获输出以及时间戳,因此我执行此操作:
top -b | awk '/dockerd/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0}'
这打印出以下内容:
2017-05-11-18:54:18 2569 root 20 0 624m 41m 28m S 0.0 4.2 0:07.32 dockerd
2017-05-11-18:54:21 2569 root 20 0 624m 41m 28m S 0.0 4.2 0:07.32 dockerd
2017-05-11-18:54:24 2569 root 20 0 624m 41m 28m S 0.0 4.2 0:07.32 dockerd
一切都很好,除非我尝试将输出重定向到这样的文件:
sudo top -b |
awk '/dockerd/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0}' >> top.txt 2>&1
top.txt
始终为空。为什么我不能将输出写入文件?
答案 0 :(得分:1)
您可以尝试重定向一次迭代的输出,然后循环它,可能是这样的:
while :; do top -n 1 -b >> top.txt; sleep 1; done
答案 1 :(得分:1)
以下行似乎对我有用。
top -b | stdbuf -o 0 awk '/wget/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0}' >> top.txt
问题是awk
(在我的情况下为gawk
)实际上是在缓冲输出(通过使用strace
确认来确认)。所以stdbuf
努力解除输出缓冲。但请注意,stdbuf
不适用于所有命令(请参阅stdbuf(1)
IE man stdbuf
)
答案 2 :(得分:0)
我相信它正在写入文件,但awk正在缓冲管道中的数据。我可以告诉你正在运行gawk,所以one of many solutions在这种情况下是添加system("")
:
top -b |
awk '/wget/ {print strftime("%Y-%m-%d-%H:%M:%S"), $0; system("")}' >top.txt 2>&1
如果您正在运行mawk
,则可以向awk命令提供-Winteractive
。
更多general-purpose solution可能会导致stdbuf
。