如何将cut命令的输出写入文件

5

我在bash上有一个自定义生成器:

#!/bin/bash
while :
do
    echo "1 2 3 4"
    sleep 1
done

我希望不要剪切第三列:

$ ./loop.sh | cut -d' ' -f3

这个很好用,但是当我尝试将它输出到文件中时:
$ ./loop.sh | cut -d' ' -f3 > myfile

什么也没有发生,这个文件是空的。我期望看到3的列,但是没有看到。我做错了什么?


2
这是一个无限循环。你如何退出它? - Michael Kazarian
@MichaelKazarian,我正在使用cut命令解析Web服务器日志(tail -f <log>),这就是为什么我使用无限循环的原因。 - Artem Mezhenin
1
你等了多久才看到是否有东西被写入到 myfile 中?它可能正在缓冲,每秒只有2个字符,需要一些时间来刷新缓冲区。 - user707650
@Evert,我等几秒钟。cut以“实时”方式写入字符串,我如何关闭缓冲? - Artem Mezhenin
几秒钟肯定太短了。 - user707650
2个回答

4
您得到了一个空文件,因为标准输出是被缓冲的。
如果您想证明这一点,可以尝试:
yes "test" > file

您需要做的是相同的,Ctrl-C停止它,并且文件中有很多“测试”。

使用您的脚本,如果删除sleep 1,您还将在myfile中看到许多3。使用sleep,我认为您只是按下了Ctrl-C太快,stdout缓冲区没有被填满/刷新。

如果您想跳过缓冲区,可以:

./loop.sh|stdbuf -o0 cut -d' ' -f3>myfile

4

正如我在评论中提到的那样,可能正在缓冲。当我尝试这个操作时,我得到了相同的结果。 你可以使用stdbuf来修改缓冲,像这样(至少对我来说有效):

./loop.sh | stdbuf -o0 cut -d' ' -f3  > myfile

缓冲区是在管道链的最后一部分完成(或看起来完成),因此这就是stdbuf的放置位置。

有关详细信息,请参见man stdbuf


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接